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
时,我应该使用哪种请求类型(GET
或 POST
)来发送 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")的使用方法