【问题标题】:PHP: file_get_contents('php://input') returning string for JSON messagePHP:file_get_contents('php://input') 返回 JSON 消息的字符串
【发布时间】:2014-03-25 08:37:38
【问题描述】:

我正在尝试在我的 PHP 应用程序中读取 JSON 消息,这是我的 php 代码:

$json = file_get_contents('php://input');
$obj = json_decode($json, TRUE);
echo $obj->{'S3URL'};

当我这样做时,我收到以下错误:

Trying to get property of non-object in setImage.php on line 25 (line 25 is the echo $obj->{'S3URL'}; line)

这是对页面的请求的请求正文:

Request Url: http://localhost:8888/setImage.php
Request Method: POST
Status Code: 200
Params: {
   "S3URL": "http://url.com"
}

这是请求标头:

Accept: application/json
Content-Type: application/json
Connection: keep-alive
Origin: chrome-extension: //rest-console-id
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML,

但是,如果我改为回显 $json 变量,我会得到以下信息:

S3URL=http%3A%2F%2Furl.com

所以看起来file_get_contents('php://input'); 将其作为字符串而不是 JSON 读取,这将使其解析更加困难。

知道为什么它不以 JSON 形式返回,或者我怎样才能让它以 JSON 形式返回?

【问题讨论】:

  • json_decode($json, TRUE);返回数组而不是对象。
  • 'php://input' 总是按原样获取请求正文。因此,如果您没有收到 JSON 代码,则不会发送任何 JSON 代码。时期。由于您得到的字符串中有一个=,因此该表单很可能以application/x-www-form-urlencoded 的形式发送
  • Abhik,是的,我尝试删除 TRUE,但仍然没有骰子。谢谢 Johannes H,我正在使用 REST 控制台发送数据,从请求的内容标头看来,它应该以 JSON 格式发送,但也许不是?

标签: php json


【解决方案1】:

您对json_decode 的使用是创建关联数组,而不是对象。您可以将其视为数组,而不是对象。如果您想要一个对象,请改用它:

$obj = json_decode($json);

See the documentation上的第二个参数为json_decode()

关联 当为 TRUE 时,返回的对象将被转换为关联数组。

此外,正如 Johannes H. 在 cmets 中指出的那样,echo $json; 的输出表明您实际上并没有收到 JSON,因此您也需要解决这个问题。你问为什么不是 JSON;如果没有看到您如何请求此脚本,则无法确定。

【讨论】:

  • 虽然正确,但这不是代码中的唯一问题。如果echo $json; 输出S3URL=http%3A%2F%2Furl.com 如问题中所述,则首先没有发送任何JSON。
  • 对,即使删除“TRUE”也没有解决问题。我认为约翰内斯在这里是正确的。
【解决方案2】:

执行这种类型的请求有两种类型

首先:您可以将其用作 stdClassObject

$data = json_decode(file_get_contents('php://input'));

它将返回一个对象,您可以从中检索数据

$name = $data->name;

第二:你可以把它当作一个数组来做这个

$data = json_decode(file_get_contents('php://input'), true);

它将返回一个对象,您可以从中检索数据

$name = $data['name'];

【讨论】:

    【解决方案3】:

    $obj = json_decode($json);

    只要去掉真

    【讨论】:

      【解决方案4】:

      问题可能来自于 php://input(是一个只读流,允许您从请求正文中读取原始数据)。 从 php.ini 更改一些设置,尝试打开“allow_url_fopen”。

      【讨论】:

        【解决方案5】:

        使用这一个结果会

        $chd = json_decode(file_get_contents('php://input'), TRUE);
        $childs = implode("",$chd);
        

        【讨论】:

          【解决方案6】:

          试试这个https://stackoverflow.com/a/56801419/7378998

          它适用于 JSON 或 jquery 帖子

          $.post(url, $('form').serialize());
          

          【讨论】:

            【解决方案7】:

            如果您使用 javascript 将 JSON 发送到 php 文件

            send_recieve.js

            var myObject = JSON.stringify({"name":"John","age":30,"city":"New York"});
            var xhr = new XMLHttpRequest();
            xhr.open("POST","http://localhost/dashboard/iwplab/j-comp/receive_send.php",false);
            xhr.setRequestHeader("Content-type","application/json");
            xhr.onreadystatechange = function(){
                if(xhr.readyState==4){console.log("xhr response:"+xhr.response)}
                alert(xhr.responseText);
             };
             xhr.send(myObject);
            

            recieve_send.php

            <?php
                $var = json_decode(file_get_contents("php://input"),true);
                echo "Data recieved by PHP file.\n";
                if ($var["name"]=="John"){
                    echo "a";
                }
                else{
                    echo "b";
                }
                //Manipulate/validate/store/retrieve to database here
                //echo statements work as response
                echo "\nSent";
            
            ?>
            

            echo 语句作为响应。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-09
              • 1970-01-01
              相关资源
              最近更新 更多