提问者:小点点

firefox/cors不允许在POST请求中使用application/json contentType?[副本]


我想通过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发送ajaxPOST请求可以正常工作,但是application/jsonget被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


共1个答案

匿名用户

具有内容类型的POST请求:如Fetch规范和MDN所述,text/plain算作简单请求。

有些请求不会触发CORS预飞行。在本文中,这些被称为“简单请求”,尽管Fetch规范(定义CORS)没有使用这个术语。“简单请求”是指满足以下所有条件的请求:允许的方法之一:

  • GET
  • POST

除了用户代理自动设置的头(例如,连接、用户代理或Fetch规范中定义为“禁止的头名称”的其他头),允许手动设置的头只有Fetch规范定义为“CORS safelisted请求头”的头,它们是:

  • 接受
  • 接受语言
  • 内容语言
  • 内容类型(但请注意以下附加要求)

内容类型标题的唯一允许值为:

  • 应用程序/x-www-form-urlencoded
  • 多部分/表单数据
  • 文本/纯文本

因此,如果发送内容类型为text/plain的POST请求,则运行的是“简单请求”。同时,使用application/json运行一个请求,该请求需要CORS飞行前请求,这意味着服务器需要使用正确的CORS头响应浏览器发送的选项请求。

您也可以使application/jsonw正常工作,但您需要从Web服务器返回正确的访问控制允许源、访问控制允许方法、访问控制允许标头,以响应浏览器发送的选项请求。