【问题标题】: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") 或 $HTTP_RAW_POST_DATA,哪一个更适合获取 JSON 请求的正文?
【发布时间】: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 多部分表单数据。

【问题讨论】:

    标签: php json xmlhttprequest


    【解决方案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 可以重复使用。
      • 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'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多