$_POST 未从 Javascript 的 Fetch() 中检索数据

Posted

技术标签:

【中文标题】$_POST 未从 Javascript 的 Fetch() 中检索数据【英文标题】:$_POST not retrieving data from Javascript's Fetch() 【发布时间】:2016-08-08 18:29:14 【问题描述】:

我正在使用 javascriptfetch() 发布数据。

    fetch('/string.php', 
      method: 'post',
      body: JSON.stringify(
        name: 'helloe world',
      )
    )
    .then(function(response) 
      if (response.status >= 200 && response.status < 300) 
        return response.text()
      
      throw new Error(response.statusText)
    )
    .then(function(response) 
      console.log(response);
    )

string.php 文件包含:

print_r($_POST);

现在我的问题是 $_POST 返回一个空数组。我可以通过附加文件来解决这个问题:

$_POST = json_decode(file_get_contents('php://input'), true);

但是这感觉很hackish,并不理想。这是从 JS fetch() 检索帖子数据时 PHP 的预期行为吗?

无论如何我可以自动将内容放在$_POST 中吗?

【问题讨论】:

对我来说看起来是正确的,您发送的是字符串的请求正文,而不是多部分表单数据。 删除 json.stringify 比解析 php://input 谢谢。这个问题给了我问题的答案。 【参考方案1】:

$_POST 仅由 application/x-www-form-urlencodedmultipart/form-data 请求填充。

对于任何其他数据格式,您需要手动解析php://input。在您的情况下,您使用json_decode 并将结果放入$_POST 超全局,这是从JSON“转换”为表单数据的可接受方式。

【讨论】:

你应该改写第一句话。对我来说听起来很错误(这是正确的,但措辞很糟糕)。 ;)【参考方案2】:

但这感觉很hackish,并不理想。

分配给$_POST 有点奇怪。它通常被视为只读。大多数人会使用另一个变量。

您应该在请求中设置 Content-Type,fetch 将默认声明字符串是纯文本,除非您另有说明。

这是 PHP 从 JS fetch() 检索帖子数据时的预期行为吗?

没有。当 PHP 不支持请求正文的内容类型时,这是预期的行为。

我是否可以自动将内容放入 $_POST 中?

发送表单编码或多部分数据,而不是 JSON 编码数据。

【讨论】:

$_POST 从什么时候开始是只读的?如果您问我,措辞不好,因为您可能意味着变量本身不是只读的,但大多数人不会覆盖 $_POST 变量或其内容,而是将其分配给新变量。 @CharlotteDunois — 这就是为什么我说“视为”而不是“是”

以上是关于$_POST 未从 Javascript 的 Fetch() 中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

POST 路由未从根路径 Laravel 5.2 中列出

控制器操作未从 JSON 读取 Guid POST

PHP页面未从iOS应用接收所有POST数据

Spring Boot 服务未从存储库执行 deleteBy

axios.post 未从服务器返回数据:“无法解构‘(中间值)’的属性‘数据’,因为它未定义”

s9_part2_fe_d48_form.md