angularJS发送OPTIONS而不是POST

时间:2015-06-08 08:22:27

标签: javascript angularjs

我坚持这两天我找不到解决方案。 当我做一个AngularJS POST时,它会在标题中发送OPTIONS并从API返回错误,代码看起来没什么特别的。

$http.defaults.headers.post["Content-Type"] = "application/json";
$http.post(URL, JSON.stringify(data)).
    success(function(data, status, headers, config) {
        alert(data);
    error(function(data, status, headers, config) {
        console.log("Error");
});

在具有标题的API上启用CORS,当我在Chrome中使用fiddler或POSTMan进行POST时,只有当我使用angularJS帖子时它才能正常运行。

为什么我会得到OPTIONS /SubmitTicket HTTP/1.1 instead of POST?

POST需要做什么?我已经读过它,它说像CORS这样的东西正在添加OPTIONS标题,但为什么呢?

4 个答案:

答案 0 :(得分:2)

当您调用CORS请求时,浏览器始终将OPTIONS请求发送到服务器以了解实际允许的方法。所以这是理想的行为。这就是所谓的:"预检请求",请参阅:http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/(部分:"预检请求")

因此,在您的情况下,您必须在' Access-Control-Allow-Methods'中允许OPTIONS方法。 CORS过滤器的标题。

答案 1 :(得分:1)

我的理解是angular最初向服务器发送OPTIONS请求,以便询问服务器是否允许完整请求。 然后,服务器将使用Headers响应,指定什么是允许的和不允许的。

我想这可能是服务器返回错误的CORS标头的问题。 你说服务器返回错误请在这里发布错误。

请参阅:http://www.staticapps.org/articles/cross-domain-requests-with-cors上的预检CORS请求 和 AngularJS performs an OPTIONS HTTP request for a cross-origin resource

答案 2 :(得分:0)

//简单的POST请求示例(传递数据):

$http.post('/someUrl', {msg:'hello word!'}).
  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.
  });

答案 3 :(得分:0)

只需要执行此代码即可使其正常工作:

angular.module('TestApp', [])
   .factory('someService', ['$http', someService]);

function someService() {
  var service = {
    save: save
  };

  var serviceUrl = '/some/Url';

  return service;

  function save(data) {
    $http.post(serviceUrl, data)
          .success(function(data, status, headers, config) {
              alert(data);
          })
          .error(function(data, status, headers, config) {
              console.log("Error");
          });
  }
}

然后将someService拉入控制器并使用:

someService.save(data);