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

我正在使用 javascript 的 fetch() 发布数据。

    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
  • 谢谢。这个问题给了我问题的答案。

标签: javascript php post


【解决方案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 — 这就是为什么我说“视为”而不是“是”
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2015-03-08
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多