Angular的$ http.post不起作用,它的'也不起作用。 $ http ...但jQuerys ajax确实如此。为什么?

时间:2015-04-20 01:42:23

标签: ajax angularjs cors angularjs-http angularjs-watch

出于某种原因:

return jquery.ajax('my url', {
    crossDomain : true
  , data : JSON.stringify({"brand": self.current})
  , type : 'POST'
  }).success(function(data){
    scope.results = data;
  });

和/或这:

curl -X POST -H "Content-Type: application/json" -d '{"brand":"target"}' myUrl

工作正常,但是这个:

var req = {
  method: "POST"
, url : "my url"
, data : JSON.stringify({"brand": self.current})
};

return $http(req).
  success(function(data){
    scope.results = data;
});

惨遭失败

"选项我的网址(匿名函数)@ angular.js:9866sendReq @ angular.js:9667 $ get.serverRequest @ angular.js:9383processQueue @ angular.js:13248(匿名函数)@ angular.js :13264 $ get.Scope。$ eval @ angular.js:14466 $ get.Scope。$ digest @ angular.js:14282 $ get.Scope。$ apply @ angular.js:14571(匿名函数)@ angular.js: 21571jQuery.event.dispatch @jquery.js:4430jQuery.event.add.elemData.handle @jquery.js:4116

(索引):1 XMLHttpRequest无法加载我的网址。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。 起源' http://localhost:5000'因此不允许访问。响应的HTTP状态代码为404."


他们是同一个网址。跆拳道。 我有一种潜在的怀疑,即" crossDomain:true" jquery中的选项是jquery的工作原理,但如果是这样,那么问题是:

我如何用角度来做到这一点?

- 使用jquery的默认ajax方法时,范围不会随结果一起更新,但我知道数据正在分配,因为我已将其注销,如果我提交再次请求,范围确实使用第二个值更新。

第二个问题 - 为什么我的观点没有用结果更新?


更新

这是失败的原因与我从服务器返回的响应无关,问题是Angular正在将此POST请求转换为OPTIONS请求: (摘自谷歌chromes' xhr工具:)

Remote Address: the remote address
Request URL:the request endpoint
Request Method:OPTIONS <-------------
Status Code:404 Not Found

进一步检查显示:

OPTIONS /my url HTTP/1.1 <--------------
Host: my urls host
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:5000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Access-Control-Request-Headers: accept, charset, content-type
Accept: */*
Referer: http://localhost:5000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

这不应该是它应该做的,因为我特意在req对象中说我传递给$ http这是一个POST请求。

...

那我怎么做角...不要那样做?

也 - 为什么这样做?

1 个答案:

答案 0 :(得分:1)

当您从浏览器执行跨源请求时,所有浏览器都会点击URL(在AJAX调用中提供)以确认跨源请求是否可用,这称为预检请求。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

因此,您的服务器端点必须允许预检请求,以便通过设置一些响应头来实现此调用(如Groovy中的示例):

response.setHeader "Access-Control-Allow-Headers", "Content-Type"
response.setHeader "Access-Control-Allow-Methods", "POST,DELETE,PUT"
response.setHeader "Access-Control-Allow-Origin", "*"