Angular GET请求:预检请求已中止

时间:2016-03-24 20:15:56

标签: javascript angularjs

我正在使用Angular 1.4.8从RESTfull API获取数据。对于用户身份验证,我们决定使用自定义HTTP标头:

 var requestConfig = {
  headers: {
      "authorization-token": "A317C3D6-74B1-DA99-FE55-8141E95D3085"
  }
};

现在,我正在尝试发出GET请求:

 $http.get(config.apiUrl+'/api/v1/orders/', requestConfig).success(function(data){
        table.orders = data;
    });

在Firebug中查看以下请求:

enter image description here

如果您尝试从其他服务器获取数据,我会看到浏览器会发出这些飞行前OPTIONS请求。在我的情况下,Angular应用程序在127.0.0.1:80上,Node.js服务器在127.0.0.1:6673上,所以它是我所理解的跨源请求

如果您尝试从curl发出OPTIONS请求,您将收到此回复:

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Cache-Control, Pragma, Origin,  
Authorization, Content-Type, X-Requested-With, authorization-token
Access-Control-Allow-Methods: GET, PUT, POST, OPTIONS
Allow: GET,HEAD,POST
Content-Type: text/html; charset=utf-8
Content-Length: 13
ETag: W/"d-7cCV5tLYsy8ebraCH4f8nQ"
Date: Thu, 24 Mar 2016 19:56:49 GMT
Connection: keep-alive

所以,我的问题是:

1)如果我删除自定义HTTP标头,为什么不调用OPTIONS请求?

2)OPTIONS响应中缺少什么,为什么它被中止?

UPD:

以下是原始GET请求的标头。我虽然看不到OPTIONS标题。

enter image description here

UPD2:

我能够从Chrome开发工具中获取OPTIONS请求的错误消息:

net::ERR_CONNECTION_REFUSED

1 个答案:

答案 0 :(得分:0)

  

如果我删除自定义HTTP标头,为什么不调用OPTIONS请求?

自定义HTTP标头是需要预检的触发器之一。

  

特别是,如果出现以下情况,请求会被预检:

     
      
  • 它使用GET,HEAD或POST以外的方法。此外,如果使用POST来发送具有除application / x-www-form-urlencoded,multipart / form-data或text / plain之外的Content-Type的请求数据,例如,如果POST请求使用application / xml或text / xml向服务器发送XML有效负载,则该请求将被预检。
  •   
  • 在请求中设置自定义标头(例如请求使用标头,例如X-PINGOTHER)
  •   

MDN