1

出于某种原因:

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 无法加载我的网址。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 源“ http://localhost:5000 ”。响应的 HTTP 状态代码为 404。”


它们是相同的网址。重量级 我偷偷怀疑 jquery 中的“crossDomain:true”选项是 jquery 工作的原因,但如果是这样的话,那么问题是:

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

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

第二个问题-为什么我的视图没有随结果更新?


更新:

失败的原因与我从服务器返回的响应无关,问题是 Angular 正在将此 POST 请求转换为 OPTIONS 请求:(取自 google 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

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

...

那么我如何制作有角度的......不要那样做?

还有——为什么要这么做?

4

1 回答 1

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", "*"
于 2015-04-20T06:59:16.837 回答