【问题标题】:PHP JSON response is not loading from URLPHP JSON 响应未从 URL 加载
【发布时间】:2020-11-29 23:59:08
【问题描述】:

这是提供 JSON 响应的链接:https://www.instagram.com/p/CDq1KJPJcTN/?__a=1

在浏览器中简单地复制和粘贴 URL 会给出 JSON 响应。但是当我尝试使用 file_get_contents 或 cURL 在 PHP 中访问相同的内容时,它显示的是 Instagram 的 html 页面代码

ini_set("allow_url_fopen", 1);
ini_set("allow_url_include", 1);

$context = [
            'http' => [
                    'method' => 'GET',
                    'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.47 Safari/537.36',
                ],
            ];
$context = stream_context_create($context);
$data = file_get_contents('https://www.instagram.com/p/CDq1KJPJcTN/?__a=1', false, $context);

卷曲:

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'https://www.instagram.com/p/CDq1KJPJcTN/?__a=1');
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.47 Safari/537.36');
$query = curl_exec($curl_handle);
curl_close($curl_handle);
echo $query;

当我使用 rest api 测试工具时(https://resttesttest.com/)。它只给出 JSON 响应。我认为缺少一些重要的标题,我无法弄清楚。 Content-Type:application/json & Access-Control-Allow-Origin: * 给出。

【问题讨论】:

  • 不知道 file_get_contents,但对于 cURL,您需要为安全 (https) 目标主机设置连接。
  • 当我运行该代码时,我得到一个 JSON 字符串,一个很大但绝对是一个 JSONString
  • @YvesLeBorg 我的 php 文件仅使用 https
  • 可能的原因:如果您认为需要设置allow_url_fopen,那么我猜它没有设置。但是,除了php.ini 文件之外,您不能从任何地方更改它的值。如果可以的话,这将不是一个安全的设置
  • 我使用 PHP CLI 运行它,工作正常,无论是否使用上下文

标签: php json api rest curl


【解决方案1】:

试试这个

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'https://www.instagram.com/p/CDq1KJPJcTN/?__a=1');
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl_handle, CURLOPT_HEADER, FALSE);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.47 Safari/537.36');
curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);

$query = curl_exec($curl_handle);
curl_close($curl_handle);

echo $query;

在本地使用 file_get_contents 对我有用

ini_set("allow_url_fopen", TRUE);
ini_set("allow_url_include", TRUE);

$context = [
            'http' => [
                    'method' => 'GET',
                    'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.47 Safari/537.36',
                ],
            ];
$context = stream_context_create($context);
$data = file_get_contents('https://www.instagram.com/p/CDq1KJPJcTN/?__a=1', false, $context);
echo $data;

【讨论】:

  • 谢谢!试过这段代码,但它给出了空白页。
  • OP 为什么要试试这个好的答案将始终解释所做的工作以及这样做的原因,不仅适用于 OP,而且适用于 SO 的未来访问者,他们可能会发现这个问题并正在阅读您的答案。如果回答得很好,也许他们会支持它。
  • 确保您在 php.ini 中启用了扩展 extension=php_curl.dll
  • 谢谢!这个答案在本地主机中工作。但不是在服务器中,我正在寻找其他问题。
  • 可能是 ssl 证书问题。检查这个stackoverflow.com/questions/18971983/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多