我正在尝试从Web浏览器向HTTP服务器发出PATCH请求。我从两端控制代码。
但是由于某种原因,我没有让CORS检查被浏览器接受。
这是一个Python-EVE API,似乎已正确配置。
为调试此错误,我将在每次请求后使用以下代码打印所有响应信息:
@app.after_request
def after(response):
print(response.status)
print(response.headers)
print(response.get_data())
return response
以及来自浏览器的那些失败请求之一的示例输出。
请注意,发送到浏览器的Access-Control-Allow-Methods指令中明确允许使用PATCH。
127.0.0.1 - - [12/Mar/2020 19:40:12] "OPTIONS /tickets/5e699625ed6b7777ddfb3bc1 HTTP/1.1" 200 -
200 OK
Content-Type: text/html; charset=utf-8
Allow: OPTIONS, PATCH, GET, HEAD, POST
Access-Control-Allow-Origin:
Access-Control-Allow-Headers: Authorization, Content-Type, Accept, If-Match
Access-Control-Expose-Headers:
Access-Control-Allow-Methods: OPTIONS, PATCH, GET, HEAD, POST
Access-Control-Max-Age: 21600
客户端代码就像简单的XMLHttpRequest
。
let xhr = new XMLHttpRequest();
xhr.addEventListener('load', onComplete.bind(this));
xhr.addEventListener('error', onError.bind(this));
xhr.open('PATCH', `http://localhost:5000/tickets/${original._id}`);
xhr.setRequestHeader('authorization', `Bearer ${_t}`);
xhr.setRequestHeader('content-type', 'application/json');
xhr.setRequestHeader('if-match', original._etag);
xhr.send(JSON.stringify(changes));
我已经在两种不同的浏览器中对此进行了测试,但结果不同,但是以相同的方式保持一致。在这两种情况下,Access-Control-Allow-Methods
指令都缺少PATCH
(您可以在上面看到的是服务器发送的not)。
这两种情况都需要某种解决方法来向本地主机执行AJAX请求。下面提到了两种解决方法。
一个OPTIONS请求被发送到服务器。该响应可以在网络选项卡中看到,并且缺少PATCH
指令。
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS
该请求被CORS策略阻止:Method PATCH is not allowed by Access-Control-Allow-Methods in preflight response.
消息可以在控制台选项卡上看到。
使用此扩展名允许localhost CORS:https://mybrowseraddon.com/access-control-allow-origin.html
一个OPTIONS请求被发送到服务器。该响应可以在网络选项卡中看到,并且缺少PATCH
指令。
Access-Control-Allow-Methods: HEAD, OPTIONS, GET, POST
PATCH请求实际上到达了服务器我相信只有这样,因为下面的扩展名。
使用此扩展名允许localhost CORS:https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/
这可能是必须的,并且与Chrome扩展程序有关。部署堆栈,问题不存在。