获取 $_POST 变量为空,同时使用 php://input 使一切正确

Getting $_POST variable as empty while getting everything correct with php://input

我创建了一个 React 应用程序,我从中调用了我在 PHP 上构建的服务器。

以下是我如何调用我的 PHP 文件:

const requestOptions = {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: JSON.stringify({ name, username, password }),
};
console.log(requestOptions);

fetch('http://localhost/crud/requests/signup.php', requestOptions)
  .then(res => res.json())
  .then(data => console.log(data));

这是我在 PHP 文件中的内容:

if (isset($_POST) && !empty($_POST)) {
  // do something
}

当我打印 $_POST 变量时,我得到一个空数组。即使 $_RESPONSE 是空的。

但是当我尝试像这样打印输入流时:

print_r(file_get_contents('php://input'));

一切似乎都很好。谁能解释为什么会这样? 我试图在文档中阅读它并在一些论坛和博客上查找但对答案不满意。

PHP 的 built-in 表单支持只能解析 application/x-www-form-urlencoded 表单和 multipart/form-data 表单。您实际发送的是 JSON-serialized object,MIME 类型不正确 application/x-www-form-urlencoded.

实际上发送application/x-www-form-urlencoded表格,使用URLSearchParams代替JSON.stringify:

fetch('http://localhost/crud/requests/signup.php', {
  method: 'POST',
  body: new URLSearchParams({ name, username, password }),
})
.then(res => res.json())
.then(data => console.log(data));

在这种情况下无需显式设置 Content-Type:改为 the browser will do that automatically. To send a multipart/form-data payload (which you may need to do if you want to upload larger files), use a FormData object。

如果您最终要发送JSON,您应该在header、application/json 中使用正确的MIME 类型发送它。在 PHP 方面,您将不得不使用 json_decode.

手动解析有效负载