在角度js中添加标头时,HTTP GET请求更改为OPTIONS

时间:2014-08-05 06:15:11

标签: javascript angularjs cors

以下是我目前使用的请求

$http.get(url)
    .success(function (data){})
    .error(function (data){})

没有任何CORS问题。我的服务器端允许所有来源,方法,所有标题

当我添加像

这样的http标头时
$http.get(url, { headers: { "USERID": user,  "SESSIONID": sessionId}})

当我在chrome dev工具网络标签中看到

时,请求会更改为OPTIONS方法

这是什么原因?如果需要,那么如何添加自定义http标头。

我已通过此链接angularjs-performs-an-options-http-request-for-a-cross-origin-resource,但它没有帮助

我希望服务器允许不同的来源。但它允许标题,只有我在同一台服务器。但不确定这是通过角度还是服务器端。

标题后

$ http.get(url,{headers:{“USERID”:user,“SESSIONID”:sessionId}})

在Chrome开发工具中,我看到了

Request Method:OPTIONS
Status Code:404 Not Found

但没有标题

Request Method:GET
Status Code:200 OK

当我在REST Client中执行此操作时,我可以将标头发送到后端。

4 个答案:

答案 0 :(得分:0)

$http({method: 'GET', url: '/someUrl', headers: { "USERID": user,  "SESSIONID": sessionId}}).
success(function(data, status, headers, config) {
  // this callback will be called asynchronously
  // when the response is available
}).
error(function(data, status, headers, config) {
  // called asynchronously if an error occurs
  // or server returns response with an error status.
});

会奏效。     $ http.get是一种快捷方法。 查看the docs

中的config

答案 1 :(得分:0)

这是一个已知错误,请参阅https://github.com/angular/angular.js/issues/1585

解决方法是使用jQuery请求。

答案 2 :(得分:0)

当我尝试在我的get中传递标题时,我遇到了同样的大问题,它更改了选项并且不起作用。为了使它工作,我在我的php api

中添加了以下内容
<?php if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {  
  if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'GET') {    
    header("Access-Control-Allow-Headers: Authorization, X-Auth-Token");    
  }
  exit;
} ?>

您可以允许您希望传递的任何标头。 希望这有帮助

答案 3 :(得分:0)

对于我的C#Web API解决方案的特殊问题,我必须处理Options请求。 Angular发送了一个预检请求方法OPTIONS,我在我的web.config中允许使用

  <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS, PATCH" />

但是这还不够,我还包括一个方法来处理选项请求而我什么都没有返回

[ResponseType( typeof( void ) )]
public IHttpActionResult OptionsPost() {
  return StatusCode( HttpStatusCode.NoContent );
}