file_get_contents("php://input") or $HTTP_RAW_POST_DATA, which one is better to get the body of JSON request?

file_get_contents("php://input") or $HTTP_RAW_POST_DATA - which one is better to get the body of JSON request?

And which request type (GET or POST) should I use to send JSON data when using client side XmlHTTPRequest?

My question was inspired from this answer: How to post JSON to PHP with curl

Quote from that answer:

From a protocol perspective file_get_contents("php://input") is actually more correct, since you're not really processing http multipart form data anyway.

308266 次浏览

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

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

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

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

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

相对于 $HTTP _ RAW _ POST _ DATA,它是一种内存消耗较少的替代方案,并且不需要任何特殊的 php.ini 指令 。 从 < a href = “ https://www.php.net/Manual/en/wrappers.php.php # wrappers.php.input”rel = “ noReferrer”> Reference

enctype="multipart/form-data"不支持 php://input

//input 是一个 只读流,它允许您读取原始数据 在 POST 请求的情况下,最好使用 使用 php://input 而不是 $HTTP _ RAW _ POST _ DATA 作为 < strong > 取决于特殊的 php.ini 指令 其中 $HTTP _ RAW _ POST _ DATA 在默认情况下没有填充,它是 可能较少的内存密集替代激活 Always _ popular _ raw _ post _ data.

资料来源: http://php.net/manual/en/wrappers.php.php

File _ get _ content (PHP://input)-获取原始的 POST 数据,当您编写 API 并需要 XML/JSON/... 输入时,您需要使用这些数据,而 PHP 无法将这些输入解码为 $_ POST 例如:

发送后 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'));