CORS:无法获取POST请求正文。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CORS:无法获取POST请求正文。相关的知识,希望对你有一定的参考价值。

我正在尝试使用XMLHttpRequest从file://example.htmlhttp://localhost/index.php发出请求。我读了很多关于CORS的内容(在这种情况下,起源是空的,这没关系。)我不知道我做错了什么。我的请求很好,但$ _POST是空的!除非我设置“Content-type:application / x-www-form-urlencoded”。但是“text / plain”或“application / json”没有给$ _POST带来任何结果......为什么?

    xhr.open("POST", "http://localhost/index.php", true);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.onreadystatechange = handler;
    xhr.send({'a':'12'});
答案

您可能正在做以下两件事之一:

如果content-type不是application/x-www-form-urlencoded,则CORS必须发送预检请求。这意味着浏览器将在POST请求之前发送OPTIONS请求,该请求用于确定是否允许POST请求。看看here这是如何工作的。

其次,如果你使用xhr.setRequestHeader("Content-Type", "application/json")$_POST参数将不会填充参数,这只是application / x-www-form-urlencoded的情况。要获得您发送的JSON,您必须执行以下操作:

<?php
  $input = json_decode(file_get_contents("php://input"), true);
  echo $input['a']; //echoes: 12

有关更多信息,请参阅this问题。

此外,如果您进入任何体面浏览器的调试工具,如果不允许CORS请求,它将创建一条错误消息,请务必检查CORS请求是否实际上是由浏览器发出的。

我希望这可以帮助你。

另一答案

补充@ user23127响应

服务器端应该有类似的东西来响应OPTIONS预检请求:

if (request.method === 'OPTIONS') {
  htmlRes = HttpResponse()
  htmlRes['Access-Control-Allow-Origin']='*' // or your not origin domain
  htmlRes['Access-Control-Allow-Methods']='*' // or POST, GET, PUT, DELETE
  htmlRes['Access-Control-Allow-Headers']='*' // Content-Type, X-REQUEST
}
// the rest of the code as if it was not a CORS request

以上是关于CORS:无法获取POST请求正文。的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Express.js 从请求中获取 POST 正文

获取 POST 请求的正文 [Java]

React 无法从 PHP API 获取响应正文

从 HttpServletRequest 获取 POST 请求正文

对 Flask 后端响应正文的获取请求为 null 且没有 cors 并且在没有 no-cors 的情况下失败

nodejs从POST请求中获取原始正文[重复]