根据这里的样本:
如果请求使用 GET、HEAD 或 POST 以外的方法。此外,如果 POST 用于发送 Content-Type 不是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 的请求数据,例如,如果 POST 请求向服务器发送 XML 有效负载使用 application/xml 或 text/xml,然后预检请求。
因此,在以下示例中,由于 XML Content-Type 和自定义标头,执行了预检X-PINGOTHER
:
var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/post-here/';
var body = '<?xml version="1.0"?><person><name>Arun</name></person>';
function callOtherDomain(){
if(invocation)
{
invocation.open('POST', url, true);
invocation.setRequestHeader('X-PINGOTHER', 'pingpong'); //<====
invocation.setRequestHeader('Content-Type', 'application/xml'); //<====
invocation.onreadystatechange = handler;
invocation.send(body);
}
}
但是在所谓的 pre-flight OPTIONS 请求中(下),只通知服务器 HTTP 方法和自定义 header。没有人告诉服务器关于XML Content-Type
.
从逻辑上讲,只要发送了预检请求,就意味着Content -Type不是不需要预检的 3 种形式。但是还有许多其他的可能性。底线是,服务器应该能够知道为什么发送预检请求。
那么服务器如何合理地决定是否允许这个缺少拼图(内容类型)的请求呢?