file_get_contents(“ php:// input”)或$ HTTP_RAW_POST_DATA,哪个是获取JSON请求正文的更好的选择?


120

file_get_contents("php://input")$HTTP_RAW_POST_DATA-获得JSON请求正文的哪个更好?

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

我的问题受到以下答案的启发: 如何使用curl将JSON发布到PHP

引用该答案:

从协议的角度来看file_get_contents("php://input")实际上是更正确的,因为无论如何您实际上并不是在处理http多部分表单数据。

Answers:


195

实际上php://input允许您读取原始POST数据。

它是$ HTTP_RAW_POST_DATA的较少内存密集型替代方法,并且不需要任何特殊的php.ini指令

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

参考: http : //php.net/manual/en/wrappers.php.php


12
另外,从PHP 5.6开始,$HTTP_RAW_POST_DATA已被认为已弃用,并且php://input可以重用。
克里斯·福伦斯


json_decode(file_get_contents('php:// input'),true)在PHP 7.1中是否支持从URL获取$ _GET值?
Kailas

自PHP 7起,$ HTTP_RAW_POST_DATA已弃用
Daniel

15

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


4
另外,从PHP 5.6开始,$HTTP_RAW_POST_DATA已被认为已弃用,并且php://input可以重用。
克里斯·福伦斯

14

file_get_contents(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'));

3

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

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


重点是:我想一次抓取整个post / get数据块,因为JSON是一种无变量格式,所以它只呈现数据。
Manuel Bitto 2010年

@Kucebe我不明白为什么这是必要的,为什么不将JSON数据放入POST字段并完成呢?
Pekka

如果您想要整个JSON块,那么为什么不将JSON文本块分配给表单字段并像这样提交呢?<input type="hidden" name="data" value="json data here" />是完全可以接受的,并允许您使用$ _REQUEST ['data']在服务器端轻松检索它。
Marc B

3
在POST字段中嵌入JSON不能达到HTTP content-type标记的目的,并且不适合在Fiddler和浏览器调试器(可以理解JSON)中进行调试。同样,许多第三方JavaScript库将JSON净荷作为application / json进行发布。
Cyber​​Monk

2

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


2
POST通常有大小限制,但通常设置得很高。检查您的php.ini
布拉德

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.