角度';s$http.post不';不起作用,它的'$http。。。但jQuerysAjax确实如此。为什么?

角度';s$http.post不';不起作用,它的'$http。。。但jQuerysAjax确实如此。为什么?,ajax,angularjs,cors,angularjs-http,angularjs-watch,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

出于某种原因:

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;
});
惨败

“选项我的url(匿名函数)@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无法加载我的url。请求的资源上不存在“访问控制允许来源”标头。 因此不允许访问源“”。响应的HTTP状态代码为404


它们是相同的url。世界跆拳道联盟。 我暗自怀疑jquery中的“crossDomain:true”选项是jquery-one工作的原因,但如果是这样,那么问题是:

我该怎么做呢? --使用jquery的默认ajax方法时,作用域不会随结果更新,但我知道数据正在被分配,因为我正在注销它,如果我再次提交请求,作用域会随第二个值更新

第二个问题-为什么我的视图没有更新结果?
更新: 失败的原因与我从服务器返回的响应无关,问题是Angular正在将此POST请求转换为选项请求: (摘自谷歌chromes的xhr工具:)

远程地址:远程地址
请求URL:请求端点

请求方法:选项当您从浏览器执行跨源请求时,所有浏览器都会点击URL(在AJAX调用中提供)以确认跨源请求是否可用,这称为飞行前请求

因此,服务器的端点必须允许飞行前请求,以便通过设置一些响应头(Groovy中的一个示例)使此调用工作:


第二个问题的答案是:您需要调用
$scope.$apply()
,因为angular不知道jquery中发生的事情。如果它们是相同的url,您能否尝试删除并仅添加“/end\u point”@AtaurRahimChowdhury?这是一个跨源请求。我正在本地开发,但服务呼叫是一个我不拥有的网站。在这种情况下,这实际上不是问题所在-服务器将发送正确的响应,但Angular正在将请求转换为选项请求,而不是POST请求。此外,您的解决方案无法解决问题,因为您没有包含“选项”在您的访问控制中,Allow MethodsAngular将此作为安全预防措施,而jQuery则没有。通过将服务器设置为“Access Control Allow Origin”、“*”,您告诉服务器允许任何内容头,从而允许您的$http.post工作。当您开始使用Angular跨域执行http调用时,CORS是一个小小的惊喜。我认为,默认情况下允许使用OPTIONS方法,因此在我的情况下它可以工作(在基于Grails的应用程序中)。可能,您的服务器默认情况下不允许该方法,因此将其添加到允许的方法中应该可以解决其中一个问题。
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
response.setHeader "Access-Control-Allow-Headers", "Content-Type"
response.setHeader "Access-Control-Allow-Methods", "POST,DELETE,PUT"
response.setHeader "Access-Control-Allow-Origin", "*"