CORS 问题? - 预检响应包含无效的 HTTP 状态代码 405
Posted
技术标签:
【中文标题】CORS 问题? - 预检响应包含无效的 HTTP 状态代码 405【英文标题】:CORS issue? - Response for preflight has invalid HTTP status code 405 【发布时间】:2018-07-07 12:16:04 【问题描述】:从我的 localhost:8080 向外部 API 发起 POST 请求时,我经常遇到 405 问题。我尝试使用许多不同的选项,但我没有得到问题的关键。
URL = api end point; //Your URL
var datajson = ''
+'"image" : "'+imageBase64+'"'
+'';
var req = new XMLHttpRequest();
var body = JSON.parse(datajson)
if ('withCredentials' in req)
req.open('POST', URL, true);
req.setRequestHeader('Content-Type', 'application/json');
req.onreadystatechange = handleResponse(req);
req.send(body);
我在浏览器中遇到的错误是:
选项http://blablabla 405(不允许的方法) sendToBioFace @ myjavascript.js:38 发送@myjavascript.js:56 onclick @(索引):13 (index):1 无法加载http://blablabla: 预检响应具有无效的 HTTP 状态代码 405
在标题下方查找:
Request URL:http://blablabla.com
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Remote Address: destinationip:16111
Referrer Policy:no-referrer-when-downgrade
Response Headers
Access-Control-Allow-Headers:X-Requested-With,Content-Type
Access-Control-Allow-Origin:*
Access-Control-Request-Method:POST,GET,PUT,DELETE,OPTIONS
Allow:POST
Content-Length:1569
Content-Type:text/html; charset=UTF-8
Date:Sun, 28 Jan 2018 19:13:42 GMT
Server:Microsoft-HTTPAPI/2.0
Request Headers
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:es-ES,es;q=0.9,en;q=0.8
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
Host: destinationip:16111
Origin:http://localhost:8080
Pragma:no-cache
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
【问题讨论】:
我在您的请求标头中没有看到“方法”? 远程blablabla
端有问题。联系他们的支持团队并检查他们的文档以确保您正确地遵循它。
每当您向远程 API 发送 CORS 请求时,浏览器都会发送一个 OPTIONS 请求,该请求必须返回状态 200 和三个标头值 Access-Control-Allow-Headers
、Access-Control-Allow-Origin
、@987654328 @。然后,浏览器将根据这些值检查您的 CORS 请求,并且仅在值和您的请求匹配时发送它。显然,远程 API 不允许 OPTIONS 请求,因此您不能从您的域调用它们的 JSON 端点。在不知道您使用的是哪个远程 API 的情况下,我们无法为您提供更多建议。
从 Postman 或 python 脚本发出请求......它可以工作。
@JorgeGarciaDominguez 这是因为 CORS 是为浏览器设计的。邮递员和你的 python 脚本不应该也不应该尊重它。
【参考方案1】:
您正在尝试发送跨域请求,但您发送的标头不包含 OPTIONS。
您应该在发出的请求中添加 OPTIONS 请求标头。
【讨论】:
您能否详细说明(包含标题的确切示例和对规范/文档的引用)?目前,整个答案没有多大意义。 您必须为这样的请求指定 2 个标头。 1.Access-Control-Allow-Origin: *
2.Access-Control-Allow-Headers :Origin, X-Requested-With, Content-Type, Accept
您是否有机会提供准确的值和对规范的参考?我不知道有什么特别之处,CORS 就是这样工作的,没有任何问题。
他们在响应中ARE。你没有把它放在请求中。
请原谅我,但我不明白你的建议。我应该设置任何请求标头吗?我应该提供更多信息吗?以上是关于CORS 问题? - 预检响应包含无效的 HTTP 状态代码 405的主要内容,如果未能解决你的问题,请参考以下文章
已启用 CORS,但在 POST JSON 时,预检响应的 HTTP 状态代码 404 无效
Laravel 5 CORS - XMLHttpRequest 无法加载 http://myapi.com。预检响应具有无效的 HTTP 状态代码 500