file_get_contents("php://input")
或$HTTP_RAW_POST_DATA
- 哪一个更适合获取JSON请求的主体?
使用客户端GET
时,我应该使用哪种请求类型(POST
或XmlHTTPRequest
)来发送JSON数据?
我的问题来自这个答案: How to post JSON to PHP with curl
从答案中引用:
从协议的角度来看
file_get_contents("php://input")
实际上更正确,因为你还没有真正处理http多部分表单数据。
答案 0 :(得分:176)
实际上php://input
允许您阅读原始POST数据。
它是$ HTTP_RAW_POST_DATA的内存密集型替代品,不需要任何特殊的php.ini指令。
php://input
不适用于enctype="multipart/form-data"
。
答案 1 :(得分:12)
php:// input是一个只读流,允许您读取原始数据 来自请求机构。在POST请求的情况下,它是可取的 使用php://输入而不是$ HTTP_RAW_POST_DATA作为它没有 依赖于特殊的php.ini指令。而且,对于那些案件 其中默认情况下不填充$ HTTP_RAW_POST_DATA,它是a 可能更少的内存密集的激活替代 always_populate_raw_post_data。
答案 2 :(得分:8)
file_get_contents(php://输入) - 获取原始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'));
答案 3 :(得分:3)
通常的规则应适用于您发送请求的方式。如果请求是检索信息(例如,部分搜索'提示'结果,或要显示的新页面等等),则可以使用GET。如果发送的数据是更改内容的请求(更新数据库,删除记录等等)的一部分,则使用POST。
服务器端,没有理由使用原始输入,除非您想一次性获取整个post / get数据块。您可以像往常一样通过_GET / _POST数组检索所需的特定信息。诸如MooTools / jQuery之类的AJAX库将处理执行实际AJAX调用和将表单数据编码为适当格式的困难部分。
答案 4 :(得分:2)
您的第二个问题很简单,GET在服务器和浏览器端的大小限制为1-2千字节,因此您必须通过POST发送任何类型的大量数据。
答案 5 :(得分:2)
对于JSON数据,将其作为“application / json”内容类型发布要容易得多。如果你使用GET,你必须在参数中对JSON进行URL编码,这有点混乱。此外,POST时没有大小限制。 GET的大小如果非常有限(最多4K)。