Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP curl请求返回对象而不是字符串_Php_Json_Object_Curl - Fatal编程技术网

如何使用PHP curl请求返回对象而不是字符串

如何使用PHP curl请求返回对象而不是字符串,php,json,object,curl,Php,Json,Object,Curl,我正在尝试从url请求数据,除一个端点外,其他大多数端点都已成功。在整个故障排除过程中,我可以检索文本并将其显示在浏览器中,但是,当我尝试将其存储为对象时,却一无所获。它实际上仍然以字符串的形式存储。我希望遍历对象,以便对内容进行计算 是因为JSON字符串格式不正确吗?如果是,我如何更正?我尝试过各种各样的解决办法,但都没有成功 重要的是要注意gzip是必需的,因此我包含了'ob_gzhandler'。这些内容只有在我使用gzhandler时才会回显 功能中的回声用于故障排除。它们说明了在何处生

我正在尝试从url请求数据,除一个端点外,其他大多数端点都已成功。在整个故障排除过程中,我可以检索文本并将其显示在浏览器中,但是,当我尝试将其存储为对象时,却一无所获。它实际上仍然以字符串的形式存储。我希望遍历对象,以便对内容进行计算

是因为JSON字符串格式不正确吗?如果是,我如何更正?我尝试过各种各样的解决办法,但都没有成功

重要的是要注意gzip是必需的,因此我包含了'ob_gzhandler'。这些内容只有在我使用gzhandler时才会回显

功能中的回声用于故障排除。它们说明了在何处生成字符串而不是对象

function CallAPI_oanda_v20($instruments)
{
    $curl = curl_init();
    $url = 'https://api-fxtrade.oanda.com/v3/instruments/'.$instruments.'/positionBook';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPGET,TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/json',
          'Authorization: <USE MY API KEY>')); 
    $response = curl_exec($ch);
    echo gettype($response); //returns "string"
    $json = json_decode($response, true);
    echo gettype($json); //returns "NULL"
    curl_close($ch);
    return $json;
}


$call = CallAPI_oanda_v20("GBP_USD");

ob_start('ob_gzhandler');
//$output = ob_get_contents();
echo $call->positionBook; //returns an error:Trying to get property 'positionBook' of non-object
echo gettype($output); //THIS WILL RETURN "string".

$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($output, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($jsonIterator as $key => $val) {
    if(is_array($val)) {
        echo "$key:\n";
    } else {
        echo "$key => $val\n";
    }
}
以下是打印的json字符串:

{"positionBook":{"instrument":"GBP_USD","time":"2019-09-02T00:00:00Z","unixTime":"1567382400","price":"1.21584","bucketWidth":"0.00050","buckets":[{"price":"1.19950","longCountPercent":"0.0189","shortCountPercent":"0.0189"},{"price":"1.20000","longCountPercent":"0.0000","shortCountPercent":"0.0189"},{"price":"1.20100","longCountPercent":"0.0000","shortCountPercent":"0.0189"},{"price":"1.20150","longCountPercent":"0.0000","shortCountPercent":"0.0757"}]}}
这正是你所期望的。输出缓冲区只是一个大字符串,每次写入时都会附加到它。当您获取type($output)时,您只是获取该缓冲区的输出,这与您的任何其他代码都无关

因为您实际上并没有向所述缓冲区写入任何内容,所以它将是一个空字符串

实际上,您并没有在任何地方使用函数($call)的结果。您应该将其传递给递归数组迭代器。在top函数中,您可能希望将TRUE作为第二个参数添加到json_decode中,以便它完全基于数组

这正是你所期望的。输出缓冲区只是一个大字符串,每次写入时都会附加到它。当您获取type($output)时,您只是获取该缓冲区的输出,这与您的任何其他代码都无关

因为您实际上并没有向所述缓冲区写入任何内容,所以它将是一个空字符串


实际上,您并没有在任何地方使用函数($call)的结果。您应该将其传递给递归数组迭代器。在top函数中,您可能希望将TRUE作为第二个参数添加到json_decode中,以便它完全基于数组

已解决。我错误地解码了gzip字符串

$response = gzdecode($response);
这是关键,同时删除:

ob_start('ob_gzhandler');
$output = ob_get_contents();
以下是已解决的代码:

{
    $curl = curl_init();
    $url = 'https://api-fxtrade.oanda.com/v3/instruments/'.$instruments.'/positionBook';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPGET,TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/json',
          'Authorization: <USE MY API KEY>')); 
    $response = curl_exec($ch);
    $response = gzdecode($response);
    $json = json_decode($response, true);
    curl_close($ch);
    return $json;
}


$call = CallAPI_oanda_v20("GBP_USD");
echo '<pre>';
print_r($call);
echo '<pre>';```
{
$curl=curl_init();
$url='1https://api-fxtrade.oanda.com/v3/instruments/“.$instruments./positionBook”;
$ch=curl\u init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($ch,CURLOPT_HTTPGET,TRUE);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组(
'内容类型:application/json',
"授权:");;
$response=curl\u exec($ch);
$response=gzdecode($response);
$json=json_decode($response,true);
卷曲关闭($ch);
返回$json;
}
$call=CallAPI_oanda_v20(“英镑/美元”);
回声';
打印(电话);
回声'```

已解决。我错误地解码了gzip字符串

$response = gzdecode($response);
这是关键,同时删除:

ob_start('ob_gzhandler');
$output = ob_get_contents();
以下是已解决的代码:

{
    $curl = curl_init();
    $url = 'https://api-fxtrade.oanda.com/v3/instruments/'.$instruments.'/positionBook';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPGET,TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/json',
          'Authorization: <USE MY API KEY>')); 
    $response = curl_exec($ch);
    $response = gzdecode($response);
    $json = json_decode($response, true);
    curl_close($ch);
    return $json;
}


$call = CallAPI_oanda_v20("GBP_USD");
echo '<pre>';
print_r($call);
echo '<pre>';```
{
$curl=curl_init();
$url='1https://api-fxtrade.oanda.com/v3/instruments/“.$instruments./positionBook”;
$ch=curl\u init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($ch,CURLOPT_HTTPGET,TRUE);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组(
'内容类型:application/json',
"授权:");;
$response=curl\u exec($ch);
$response=gzdecode($response);
$json=json_decode($response,true);
卷曲关闭($ch);
返回$json;
}
$call=CallAPI_oanda_v20(“英镑/美元”);
回声';
打印(电话);
回声'```

不太确定你的问题到底是什么。你实际上面临什么问题?JSON看起来是有效的,
$call
理论上应该是一个对象。JSON是有效的。您是否尝试过
echo$call->positionBook?如果这不起作用,那就
echo$call
ob\u get\u contents
返回一个字符串,而只需使用
$call
,它有您的object您的函数返回一个值;它不会为ob_打印任何内容开始捕捉Tim说的话,并且一旦你使用$call(根据Lawrence的评论),就不要再解码它了。不确定你的问题到底是什么。你实际上面临什么问题?JSON看起来是有效的,
$call
理论上应该是一个对象。JSON是有效的。您是否尝试过
echo$call->positionBook?如果这不起作用,那就
echo$call
ob\u get\u contents
返回一个字符串,而只需使用
$call
,它有您的object您的函数返回一个值;它不会为ob_打印任何内容开始捕捉Tim所说的内容,并且一旦你使用$call(根据Lawrence的评论),就不要再解码它了。