我坚持这两天我找不到解决方案。 当我做一个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标题,但为什么呢?
答案 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);