【问题标题】:Why is HttpRequest sending the OPTIONS verb instead of POST?为什么 HttpRequest 发送的是 OPTIONS 动词而不是 POST?
【发布时间】:2013-03-25 00:20:58
【问题描述】:

我得到了这个代码:

var req = new HttpRequest();
req.open("POST", "http://localhost:8031/rest/user/insert");
req.setRequestHeader("Content-type", "application/json");
req.send(json.stringify(user_map));

但是,当我在提琴手中看到它时,我没有发送 POST 动词,而是看到:

OPTIONS http://localhost:8031/rest/user/insert HTTP/1.1
Host: localhost:8031
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:3030
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.33 (KHTML, like Gecko) Chrome/27.0.1430.0 (Dart) Safari/537.33
Access-Control-Request-Headers: origin, content-type
Accept: */*
Referer: http://127.0.0.1:3030/E:/grole/dart/Clases/Clases/web/out/clases.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es-ES,es;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

如您所见,它使用的是 OPTIONS 动词而不是 POST?

发生了什么事?

【问题讨论】:

  • OPTION 动词用于发送预检请求,用于检查服务器是否发送跨域请求。因为源 -> 127.0.0.1:8031 和主机 -> localhos:3t

标签: post httprequest dart


【解决方案1】:

OPTIONS 动词是一些浏览器发送的预检请求,用于检查跨源请求的有效性。它几乎与服务器检查Origin(requester) 是否被允许对指定资源发出请求。此外,根据服务器发回的标头,它让浏览器知道允许源向服务器请求哪些标头、方法和资源。

浏览器发送 OPTIONS 请求,然后如果服务器返回正确的标头(CORS 标头),允许源发出请求,您应该会看到您的 POST 请求随后通过。

请注意,必须在 OPTIONS 响应和 POST 响应中返回 CORS 标头。这意味着您的服务器必须能够响应您要跨域访问的路由上的 options 方法。

这称为跨域资源共享。 Mozilla 有一些关于这个主题的非常好的文档。 https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

如果您有更多问题,请告诉我,我会回答。

【讨论】:

    【解决方案2】:

    避免此问题的一种方法是发送不带自定义标头的请求负载并使用 formData 设置您的请求负载。

    【讨论】:

    • 您能否给出完整的答案?见How to Answer。现在它更适合作为评论,因为它只是一个一般性建议
    猜你喜欢
    • 2014-04-16
    • 2016-06-14
    • 2021-11-13
    • 2015-07-27
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多