在php中读取json输入

Posted

技术标签:

【中文标题】在php中读取json输入【英文标题】:Reading json input in php 【发布时间】:2013-08-24 16:05:38 【问题描述】:

php://input 在 localhost 中正常工作。但在服务器中它返回空。 我网站的输入(请求)是jsonREST - application/json 类型),所以$_POST 不起作用(请阅读This question)。

$_POST 适用于 key-value 对类型的输入,例如 form-data 或 x-www-urlencoded

key1=value1&key2=value2&key3=value3

我使用 application/json 作为输入(在 REST 中)。

喜欢'key1':'value1','key2':'value2','key3':'value3'

这无法使用$_POST 处理。但是使用php://input 可以帮助读取该数据。

我的代码

class Webservice_Controller extends CI_Controller 
    public $json_input_data;
    public function __construct()
        parent::__construct();
        $this->json_input_data = json_decode(file_get_contents('php://input'),TRUE);
    
    public function json_input($label)
        if(isset($this->json_input_data[$label])) return $this->json_input_data[$label];
        else return NULL;
    

上面的代码在另一个网络服务器上也可以正常工作,但在当前的网络服务器上不行。 :(

我认为我的网络服务器拒绝访问php://input

还有其他方法可以读取php中的json输入吗?

【问题讨论】:

首先要检查,php 版本是否相同,是否设置了allow_fopen_url __construct() 中尝试var_dump($this->json_input_data ) @RohanKumar -> 它在我托管的服务器中打印“NULL”。在 localhost 中打印 "array(2) ["id"]=> string(2) "79" ["t"]=> string(5) "22_00" "。 @DevZer0 PHP 版本是 5.3,它支持。我没有在我的控制面板中找到访问 php.ini 文件的选项(它是共享服务器)。有什么方法可以测试吗?请帮助.. 【参考方案1】:

我知道这是旧的,但它可能会帮助其他人:

谨慎使用 json 中的单引号

来自关于 json_decode 的 PHP 文档:

the name and value must be enclosed in double quotes
single quotes are not valid 

$bad_json = " 'bar': 'baz' ";
json_decode($bad_json); // null

【讨论】:

【参考方案2】:

php://input 是一个只读流,允许您读取原始数据 从请求正文。在 POST 请求的情况下,最好 使用 php://input 而不是 $HTTP_RAW_POST_DATA 因为它没有 依赖于特殊的 php.ini 指令。此外,对于那些情况 $HTTP_RAW_POST_DATA 默认不填充,它是一个潜在的 激活时内存占用较少的替代方案 always_populate_raw_post_data。 php://input 不适用于 enctype="multipart/form-data"

见wrappers

也试试这个,

....
  public function __construct()
    parent::__construct();
    if(isset($_POST))
    
       var_dump(file_get_contents('php://input'));
       $this->json_input_data=json_decode(file_get_contents('php://input'),TRUE);
    
    else echo 'Not Post';
  
....

另外检查allow_url_fopen

【讨论】:

我看到了包装器,而且输入不是 enctype="multipart/form-data"。它在 localhost 中运行良好,但是当我使用 php://input 时,我用来托管的 Web 服务器返回 null。可能是它拒绝访问。我想知道是否可以用任何其他方法来做??? 它在我托管的服务器中给出“NULL”。在 localhost 中打印 "array(2) ["id"]=> string(2) "79" ["t"]=> string(5) "22_00" "。在问题的cmets中提到了它。我认为在该 Web 服务器中无法访问“php://input”。

以上是关于在php中读取json输入的主要内容,如果未能解决你的问题,请参考以下文章

从 google maps 地方 api 读取 json 文件(使用 javascript 或 php)

在 BigQuery 中读取时,未定义行 XXXX、列 xx-xx 处的 JSON 输入意外结束

无法读取 JSON:字段名称中出现意外的输入结束

[FBCTF2019]RCEService

Godot:根据输入读取JSON文件并将其输出为Textbook

Java 读取 JSON 输入流