curl_exec()打印返回的JSON数据,不会将其放入变量中

时间:2014-05-29 18:27:00

标签: php curl

Stack Overflow上有很多这样的问题。其他地方,但它们似乎都适用于早期版本的PHP,因为它们的答案引用CURLOPT_RETURNTRANSFERopen_basedirallow_url_include

我使用的是PHP 5.4.17。这是我的代码:

$curl = curl_init();

if ($curl === False)
{
  die('Fatal error initiating CURL');
}

curl_setopt_array($curl, 
   array(CURLOPT_HTTPGET => True,
         CURLOPT_RETURNTRANSFER => True,
         CURLOPT_FOLLOWLOCATION => True,
          CURLOPT_URL => $gatewayURL . $parameters 
         ));

$rawJasonData = curl_exec($curl); 
curl_close($curl); 

if ($rawJasonData === False)

代码似乎没问题 - 虽然我承认这是我第一次使用CURL - 因为返回的JSON数据被回显。

我想在变量中捕获它,我该怎么做(不使用输出缓冲)?


[更新]我某些我自己没有var_dump()echo结果。不是1而不是True,也不是大写TRUE有任何区别。

我在本地开发,但在我的网址中使用Windows HOST文件中的条目,而不是localhost。

3 个答案:

答案 0 :(得分:1)

可能不是问题,但是:

curl_setopt_array($curl, 
                   array(CURLOPT_HTTPGET => 1,
                         CURLOPT_RETURNTRANSFER => 1,
                         CURLOPT_FOLLOWLOCATION => 1,
                         CURLOPT_HEADER => 0,
                         CURLOPT_URL => $gatewayURL . $parameters));

在以前的PHP版本中,我在设置curl选项时遇到了使用True的重大问题。给1打一看,看看会发生什么。这对我有用,但这可能是由于我工作的环境。只是想提一下,以防你有一些奇怪的环境(就像我有的那样)造成了最奇怪的问题。

至于个人偏好,我更喜欢使用以下方法来设置选项:

$curl = curl_init($url);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_CURLOPT_HTTPGET, 1);

关于你的问题 - 我会删除CURLOPT_FOLLOWLOCATION,因为它会遵循重定向,你不应该在你的情况下。

我怀疑CURLOPT_FOLLOWLOCATION是这里的问题。

答案 1 :(得分:1)

不确定为什么cURL不适合你,但由于你只是在做一个简单的GET请求,为什么不这样做呢?

$rawJasonData = file_get_contents($gatewayURL.$parameters);

答案 2 :(得分:0)

我看到代码的一大问题是TrueFalse中的第一个大写字母应该是TRUEFALSE。以下是我的代码的重构版本应该可以工作:

$curl = curl_init();

if (!$curl) {
  die('Fatal error initiating CURL');
}

$curl_options = array();
$curl_options['CURLOPT_HTTPGET'] = TRUE;
$curl_options['CURLOPT_RETURNTRANSFER'] = TRUE;
$curl_options['CURLOPT_HTTPGET'] = TRUE;
$curl_options['CURLOPT_HTTPHEADER'] = array('Content-Type: application/json', 'Accept: application/json');
$curl_options['CURLOPT_URL'] = $gatewayURL . $parameters;

curl_setopt_array($curl, $curl_options);

$rawJasonData = curl_exec($curl); 

curl_close($curl); 

if (!$rawJasonData)

我将CURLOPT_HTTPGET添加为TRUE以强制GET curl中的行为以及CURLOPT_HTTPHEADER中与JSON相关的标头。

过去所有这些都设置为=== False的检查有点过分。只需设置if (!$curl) {if (!$rawJasonData)即可按预期工作。

如果仍然以某种方式不起作用,请将TRUE值更改为1,如下所示:

$curl_options = array();
$curl_options['CURLOPT_HTTPGET'] = 1;
$curl_options['CURLOPT_RETURNTRANSFER'] = 1;
$curl_options['CURLOPT_HTTPGET'] = 1;