我正在使用一个与 REST API 对话的 Angular 应用。
我已经设置了访问控制,以便我的 GET 请求按预期工作。 (浏览器发送预检 OPTIONS 请求,然后触发后续的 GET)。
但是,我的 PUT 遇到了问题。
问题是,使用 PUT 时,选项预检似乎返回正常,但 PUT 永远不会触发。
首先我将展示什么是有效的,然后是什么是失败的。我正在利用 Charles 来监视通话。
获取(工作)
1) 预检请求
OPTIONS /v1/account HTTP/1.1
Host api.mysite.com
Access-Control-Request-Method GET
Origin http://127.0.0.1:9000
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
Access-Control-Request-Headers accept, authorization
Accept */*
Referer http://127.0.0.1:9000/
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
2) 飞行前响应
HTTP/1.1 200 OK
Server nginx/1.6.0
Date Wed, 21 May 2014 15:43:25 GMT
Content-Type application/octet-stream
Content-Length 0
Connection keep-alive
Access-Control-Allow-Origin *
Access-Control-Allow-Methods *
Access-Control-Allow-Headers Origin, X-Requested-With, Content-Type, Accept, Authorization, WWW-Authenticate, X-BLURR-DEBUG
Access-Control-Allow-Credentials true
3)GET请求
GET /v1/account HTTP/1.1
Host api.mysite.com
Accept application/json, text/plain, */*
Origin http://127.0.0.1:9000
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
AUTHORIZATION DFHD8D...
Referer http://127.0.0.1:9000/
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
4) GET 响应
{ some json as expected }
PUT(不起作用)
现在,这里的 PUT 似乎返回了一个不错的预检响应,但从未到达 PUT 请求:
1) 预检请求
OPTIONS /v1/account HTTP/1.1
Host api.mysite.com
Access-Control-Request-Method PUT
Origin http://127.0.0.1:9000
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
Access-Control-Request-Headers accept, authorization, content-type
Accept */*
Referer http://127.0.0.1:9000/
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
2) 飞行前响应
HTTP/1.1 200 OK
Server nginx/1.6.0
Date Wed, 21 May 2014 15:51:41 GMT
Content-Type application/octet-stream
Content-Length 0
Connection keep-alive
Access-Control-Allow-Origin *
Access-Control-Allow-Methods *
Access-Control-Allow-Headers Origin, X-Requested-With, Content-Type, Accept, Authorization, WWW-Authenticate, X-BLURR-DEBUG
Access-Control-Allow-Credentials true
问题
看起来 PUT 的预检响应没问题,所以我不确定为什么浏览器从不发送实际 PUT 请求。
任何帮助或指导都会很棒!谢谢
最佳答案
*(星号)不是 Access-Control-Allow-Methods
header 的有效值。您需要列出实际的方法(例如 GET、PUT
)。看起来虽然服务器的预检响应成功,但浏览器可能仍然拒绝预检并且不发送实际的请求。检查浏览器的控制台日志是否有任何错误。
关于angularjs - CORS 预检返回 200 但后续 PUT 永远不会发生(具有外部 REST API 的 Angular JS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788387/