无法从 $_POST 变量访问使用 JSON.stringify 序列化的表单数据

Aru*_*hra 2 javascript php json x-www-form-urlencoded

我创建了一个 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));
Run Code Online (Sandbox Code Playgroud)

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

if (isset($_POST) && !empty($_POST)) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

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

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

print_r(file_get_contents('php://input'));
Run Code Online (Sandbox Code Playgroud)

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

use*_*170 5

PHP\xe2\x80\x99s内置的表单支持只能解析application/x-www-form-urlencoded表单和multipart/form-data表单。您实际发送的是一个 JSON 序列化对象,其 MIME 类型不正确application/x-www-form-urlencoded

\n

实际发送application/x-www-form-urlencoded表单,请使用URLSearchParams而不是JSON.stringify

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

在这种情况下不需要Content-Type显式设置:浏览器会自动执行此操作。要发送multipart/form-data有效负载(如果您想上传较大的文件,您可能需要这样做),请改用对象FormData

\n

如果您毕竟想发送 JSON,则应该在标头中使用正确的 MIME 类型来发送它application/json。在 PHP 方面,您将不得不使用json_decode.

\n