file_get_contents("php://input") 或 $HTTP_RAW_POST_DATA,哪一个更适合获取 JSON 请求的正文?

Posted

技术标签:

【中文标题】file_get_contents("php://input") 或 $HTTP_RAW_POST_DATA,哪一个更适合获取 JSON 请求的正文?【英文标题】:file_get_contents("php://input") or $HTTP_RAW_POST_DATA, which one is better to get the body of JSON request? 【发布时间】:2011-02-13 10:47:03 【问题描述】:

file_get_contents("php://input")$HTTP_RAW_POST_DATA - 哪一个更适合获取 JSON 请求的正文?

当使用客户端 XmlHTTPRequest 时,我应该使用哪种请求类型(GETPOST)来发送 JSON 数据?

我的问题来自这个答案: How to post JSON to PHP with curl

引用该答案:

从协议的角度来看,file_get_contents("php://input") 实际上更正确,因为您实际上并没有真正处理 http 多部分表单数据。

【问题讨论】:

【参考方案1】:

您的第二个问题很简单,GET 在服务器端和浏览器端都有 1-2 KB 的大小限制,因此您必须通过 POST 发送任何类型的大量数据。

【讨论】:

【参考方案2】:

通常的规则应该适用于您发送请求的方式。如果请求是检索信息(例如,部分搜索“提示”结果,或要显示的新页面等),您可以使用 GET。如果发送的数据是更改某些内容(更新数据库、删除记录等)请求的一部分,则使用 POST。

在服务器端,没有理由使用原始输入,除非您想一次性获取整个 post/get 数据块。您可以像往常一样通过 _GET/_POST 数组检索所需的特定信息。 MooTools/jQuery 等 AJAX 库将处理执行实际 AJAX 调用并将表单数据编码为适合您的格式的困难部分。

【讨论】:

这就是重点:我想一次性抓取整个 post/get 数据块,因为 JSON 是一种无变量格式,它只代表数据。 @Kucebe 我不明白为什么这是必要的,为什么不将 JSON 数据放入 POST 字段并完成它? 如果您想要整个 JSON 块,那么为什么不将 JSON 文本块分配给表单字段并像这样提交呢? <input type="hidden" name="data" value="json data here" /> 是完全可以接受的,可以让您在服务器端使用 $_REQUEST['data'] 轻松检索它。 在 POST 字段中嵌入 JSON 违背了 HTTP 内容类型标记的目的,并且不适合在 Fiddler 和浏览器调试器(可以理解 JSON)中进行调试。此外,许多第 3 方 javascript 库将 JSON 有效负载发布为 application/json。【参考方案3】:

对于 JSON 数据,将其发布为“application/json”内容类型要容易得多。如果使用 GET,则必须在参数中对 JSON 进行 URL 编码,这有点混乱。此外,进行 POST 时没有大小限制。 GET 的大小非常有限(最多 4K)。

【讨论】:

POST 通常有大小限制,但通常设置得相当高。检查您的php.ini【参考方案4】:

实际上php://input 允许您读取原始请求正文。

它是 $HTTP_RAW_POST_DATA 的内存密集型替代方案,不需要任何特殊的 php.ini 指令。 来自Reference

php://input 不适用于enctype="multipart/form-data"

【讨论】:

另外,从 PHP 5.6 开始,$HTTP_RAW_POST_DATA 被认为已弃用,php://input 可以重复使用。 另见enable_post_data_reading json_decode(file_get_contents('php://input'),true) 在 PHP 7.1 中是否支持从 URL 获取 $_GET 值? $HTTP_RAW_POST_DATA 自 PHP 7 起已被弃用【参考方案5】:

php://input 是一个只读流,允许您读取原始数据 从请求正文。在 POST 请求的情况下,最好 使用 php://input 而不是 $HTTP_RAW_POST_DATA 因为 它没有 依赖于特殊的 php.ini 指令。此外,对于这些情况 其中 $HTTP_RAW_POST_DATA 默认不填充,它是 激活时可能会占用更少的内存 always_populate_raw_post_data。

来源:http://php.net/manual/en/wrappers.php.php。

【讨论】:

另外,从 PHP 5.6 开始,$HTTP_RAW_POST_DATA 被视为已弃用,php://input 可以重复使用。【参考方案6】:

file_get_contents(php://input) - 获取原始 POST 数据,当您编写 API 并需要无法通过 PHP 解码为 $_POST 的 XML/JSON/... 输入时需要使用它 一些例子:

通过邮寄 JSON 字符串发送

<input type="button" value= "click" onclick="fn()">
<script>
 function fn()


    var js_obj = plugin: 'jquery-json', version: 2.3;

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax(
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data)
    console.log(data);
  

);

    
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));

【讨论】:

以上是关于file_get_contents("php://input") 或 $HTTP_RAW_POST_DATA,哪一个更适合获取 JSON 请求的正文?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决此警告:file_get_contents(): Unable to find the wrapper "public"?

file_get_contents("php://input") 或 $HTTP_RAW_POST_DATA,哪一个更适合获取 JSON 请求的正文?

file_get_contents("php://input")的使用方法

file_get_contents("php://input")的使用方法

file_get_contents("php://input")的使用方法

php curl和file_get_contents读不到数据