【问题标题】:How do I get variables from JSON when I am receiving this error: failed to open stream: HTTP request failed收到此错误时如何从 JSON 获取变量:未能打开流:HTTP 请求失败
【发布时间】:2020-01-17 00:40:38
【问题描述】:

所以我正在使用以下源代码尝试检索 JSON 数据并解析为 PHP 字符串变量:

<?php

$jsonfile3 = file_get_contents("https://www.quandl.com/api/v3/datasets/CHRIS/CME_C1.json");
$jsondata3 = json_decode($jsonfile3);

$cbot_date1 = $jsondata3->dataset->data[0][0];

 echo $cbot_date1; 

 ?>

当我在浏览器中使用该 URL 时,我可以看到所有数据。但是,当我尝试运行脚本时,出现以下错误:

打开流失败:HTTP 请求失败!

我在 stackoverflow 上看到过类似的帖子,但源代码与我使用的有些不同,所以我有点困惑,希望能得到您的帮助。我正在使用的相同代码在其他 API/JSON 数据源中运行良好。

请让我知道我在上面示例中显示的源代码特定的任何可能的解决方案。任何帮助是极大的赞赏。

谢谢!

【问题讨论】:

  • 可能有 Apache / PHP 设置阻止您使用 file_get_contents 获取远程服务器数据。
  • 需要在php.ini中设置allow_fopen_url为true
  • allow_url_fopen 设置为“开”。还有其他建议吗?

标签: php json api file-get-contents


【解决方案1】:

您可以为此使用 php curl

基于您的代码(未经测试):

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://www.quandl.com/api/v3/datasets/CHRIS/CME_C1.json",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Accept: */*",
    "Accept-Encoding: gzip, deflate",
    "Cache-Control: no-cache",
    "Connection: keep-alive",
    "Host: www.quandl.com",
    "cache-control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if (!$err) {

  $jsondata3 = json_decode($response);

  $cbot_date1 = $jsondata3->dataset->data[0][0];

  echo $cbot_date1; 

} else {
  echo "cURL Error #:" . $err;
}

说明:

  • 首先初始化 curl
  • 向您要求的url 发出请求
  • 获取响应/错误
  • 检查是否有错误
  • 如果不解析json并显示数据。

注意:我还注意到您要求的数据是 1010.75 KB(有点大)。而且平均请求时间是3.41s(有点长)。 curl 可能会给出超时错误。这就是为什么我添加了 30 秒的 CURLOPT_TIMEOUT


经过一些测试,我得出的结论是匿名呼叫的速率限制开始了。

QELx01429 You have exceeded your daily call limit as an anonymous user.

我建议你获取一个 api 密钥,然后在这个 ?api_key=YOURAPIKEY 到 url。

限速:你还评论说你得到一个白页,因为没有curl错误,而是json中的限速错误。 Quandl.com的限速文档

【讨论】:

  • 尝试此代码时出现白屏,并且在我的错误日志文件中也看不到任何新内容:(
  • 如果您将print_r($jsondata3); 添加到 json_decode 行之后的下一行。您会得到原始响应。如果我运行它,我会收到以下错误You have exceeded the anonymous user limit of 50 calls per day. To make more calls today, please register for a free Quandl account and then include your API key with your requests. 这似乎是该数据集的速率限制问题。
猜你喜欢
  • 2015-11-08
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2018-07-27
  • 2014-12-14
  • 1970-01-01
  • 2013-07-06
相关资源
最近更新 更多