我创建了一个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变量时,我得到一个空array.甚至$_RESPONSE都是空的.

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

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

一切似乎都很好.有人能解释为什么会这样吗?

推荐答案

PHP的内置表单支持只能解析application/x-www-form-urlencoded个表单和multipart/form-data个表单.您实际发送的是一个JSON序列化对象,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.要发送multipart/form-data有效载荷(如果要上传更大的文件,可能需要这样做),请使用FormData对象.

如果你还是想发送JSON,你应该在头application/json中用正确的MIME类型发送它.在PHP方面,您将不得不使用json_decode手动解析有效负载.

Javascript相关问答推荐

Angular 拦截器错误处理删除方法问题

在JavaScript中打开和关闭弹出窗口

基于每个索引迭代嵌套对象

用户单击仅在JavaScript中传递一次以及其他行为

如何使用Echart 5.5.0创建箱形图

如何为GrapesJS模板编辑器创建自定义撤销/重复按钮?

在JavaScript中声明自定义内置元素不起作用

网页自检测外部元素无法加载

使搜索栏更改语言

使用useEffect,axios和useParams进行react测试

引用在HTMLAttributes<;HTMLDivElement>;中不可用

我怎么在JS里连续加2个骰子的和呢?

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

使用带有HostBinding的Angular 信号来更新样式?

为什么我的按钮没有从&q;1更改为&q;X&q;?

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

更改agGRID/Reaction中的单元格格式

使用createBrowserRoutVS BrowserRouter的Reaction路由

通过解构/功能组件接收props-prop验证中缺少错误"

在对象的嵌套数组中添加两个属性