在请求http.GET时发送Angular2 OPTIONS方法

时间:2016-04-01 10:07:38

标签: http cors angular

我正在尝试将basic authentification添加到我的angular2应用中。

public login() {
    // Set basic auth headers
    this.defaultHeaders.set('Authorization', 'Basic ' + btoa(this.username + ':' + this.password));

    console.log('username', this.username)
    console.log('password', this.password)
    console.log(this.defaultHeaders)

    // rest is copy paste from monbanquetapiservice
    const path = this.basePath + '/api/v1/development/order';        

    let req = this.http.get(path, { headers: this.defaultHeaders });
    req.subscribe(
        _ => { },
        err => this.onError(err)
    );
}

我希望看到的是一个带有Authorization标题的GET请求。

但我看到的首先是带有此标题的 OPTIONS

OPTIONS /api/v1/development/order HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Access-Control-Request-Headers: authorization, content-type
Accept: */*
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6,fr;q=0.4

由于我的服务器在此网址上不允许 OPTIONS ,因此出现错误。

我知道像PUT或POST这样的方法首先发送一个OPTIONS方法来预检请求,但是GET没有。

为什么angular2的http会先发送一个OPTIONS?

感谢。

2 个答案:

答案 0 :(得分:73)

这是CORS的工作方式(使用跨域请求时)。使用CORS,远程Web应用程序(此处为域mydomain.org)会选择是否可以通过一组特定标头提供请求。

CORS规范区分了两个不同的用例:

  • 简单请求。如果我们使用HTTP GET,HEAD和POST方法,则此用例适用。对于POST方法,仅支持具有以下值的内容类型:text / plain,application / x-www-form-urlencoded和multipart / form-data。
  • 预检请求。当“简单请求”用例不适用时,会发出第一个请求(使用HTTP OPTIONS方法),以检查在跨域请求的上下文中可以执行的操作。

不是Angular2发送OPTIONS请求而是浏览器本身。它与Angular无关。

有关详细信息,请查看此文章:

答案 1 :(得分:6)

Why am I getting an OPTIONS request instead of a GET request?

这是由浏览器本身生成的CORS预检请求。

另见
- How to disable OPTIONS request?

需要将服务器配置为支持CORS请求,只有在GET请求后浏览器才会发送实际的OPTIONS请求。

另见
- "No 'Access-Control-Allow-Origin' header is present on the requested resource" - https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

  

使用-控制允许证书

     

指示在credentials标志为true时是否可以公开对请求的响应。当用作对预检请求的响应的一部分时,这指示是否可以使用凭证进行实际请求。请注意,简单的GET请求不是预检的,因此如果对具有凭据的资源发出请求,如果该资源未返回此标头,则浏览器将忽略该响应,而不会将其返回到Web内容。