为什么HttpRequest发送OPTIONS动词而不是POST?

31

我得到了这段代码:

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));

但是,当我在Fiddler中查看时,我并没有发送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。 - kiran
2个回答

42
OPTIONS动词是一种预检请求,由某些浏览器发送以检查跨域请求的有效性。它基本上会向服务器检查是否允许Origin(请求方)为指定资源发出请求。此外,根据服务器返回的标头,它会通知浏览器,该来源允许从服务器请求哪些标头、方法和资源。
浏览器发送OPTIONS请求,如果服务器回答正确头信息(CORS头信息),允许源发出请求,那么您就应该看到随后进行POST请求。
请注意,CORS头必须同时在OPTIONS响应和POST响应中返回。这意味着您的服务器必须能够在要跨域访问的路由上响应options方法。
这被称为跨域资源共享,Mozilla对此有一些非常好的文档。https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS 如果您有更多问题,请告诉我,我会回答它们。

0
避免这个问题的一种方法是在发送请求负载时不使用自定义标头,并使用formData设置您的请求负载。

1
你能把这个变成一个完整的答案吗?请参考[答案]。现在它更适合作为评论,因为它只是一个一般性的建议。 - camille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接