我想通过POST请求(使用ajax)发送一个json
到我的服务器,但是每次尝试都被CORS阻止了。阅读为什么它被封锁一点帮助都没有。在某个时候,这里的一个评论声称,不允许有contentTypejson
的POST请求(对不起,我找不到相关的帖子了)。所以我测试了一些东西。我写了以下php
文件:
<?php
header("Access-control-allow-origin: *");
header('Content-Type: application/json');
echo json_encode(["someVal" => true]);
?>
我在端口8081
上运行了它。使用contentTypetext/plain
发送ajax
POST请求可以正常工作,但是application/json
get被CORS阻止。
相关javascript:
$.ajax({
url: "http://localhost:8081/someapi.php",
contentType: "text/plain", //"application/json",
method: "POST",
crossDomain: true,
data: {val: "asd"},
success: function(data, status, xhr) {
console.log("success");
},
error: function(data, status, xhr) {
console.log("fail");
}
});
为什么会这样呢?如果我不亲自测试,我从哪里得到这些信息?是否有可能通过POST请求发送json
?
具有内容类型的POST请求:如Fetch规范和MDN所述,text/plain算作简单请求。
有些请求不会触发CORS预飞行。在本文中,这些被称为“简单请求”,尽管Fetch规范(定义CORS)没有使用这个术语。“简单请求”是指满足以下所有条件的请求:允许的方法之一:
除了用户代理自动设置的头(例如,连接、用户代理或Fetch规范中定义为“禁止的头名称”的其他头),允许手动设置的头只有Fetch规范定义为“CORS safelisted请求头”的头,它们是:
内容类型标题的唯一允许值为:
因此,如果发送内容类型为text/plain的POST请求,则运行的是“简单请求”。同时,使用application/json运行一个请求,该请求需要CORS飞行前请求,这意味着服务器需要使用正确的CORS头响应浏览器发送的选项请求。
您也可以使application/jsonw正常工作,但您需要从Web服务器返回正确的访问控制允许源、访问控制允许方法、访问控制允许标头,以响应浏览器发送的选项请求。