file_get_contents没有获取正确的JSON

时间:2014-04-14 02:27:23

标签: php json file-get-contents

我有一个特殊的问题。

我有一个获取JSON的脚本。它在浏览器中完美运行(给出正确的json)。例如。访问网址

http://example.com/json_feed.php?sid=21662567
浏览器中的

为我提供了以下JSON(显示的代码段):

{"id":"21662567","title":"Camp and Kayak in Amchi Mumbai.   for 1 Booking...

可以看出,sid(URL)和JSON的id匹配并且是正确的json。



但是通过file_get_contents访问时,相同的URL会给我错误的结果。代码相当简单,因此,我完全不知道为什么会发生这种情况。

$json = file_get_contents("http://example.com/json_feed.php?sid=21662567");
echo "<pre>";
var_dump($json);
echo "</pre>";

上述代码的JSON响应是:

string(573) "{"id":"23160210","title":"Learn about Commodity Markets (Gold\/Silver) for...

可以看出,sid和id现在不匹配,并且获取的JSON不正确。

我也尝试使用curl,认为它可能是一些格式问题,但无济于事。 curl也会获取相同的错误JSON。

同时,在浏览器中访问原始URL将获取正确的JSON。

关于这里发生了什么的任何想法?

Talvinder编辑(2014年4月14日,0913 IST)

ISSUE SPOTTED:脚本json_feed.php取决于会话,file_get_contents不传递会话值。我不知道如何在cURL中构建HTTP_REQUEST。有人可以帮我弄这个吗?我目前的cURL代码是:

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 OPR/20.0.1387.91');
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);

其中$ url是问题开头给出的网址。

TALVINDER编辑(1805年4月14日,IST) 杀死之前分享的链接,因为它们已经死了。

TALVINDER编辑(4月14日,810,IST):

JSON可以在这里看到:JSON GENERATOR

file_get_content结果可以在这里看到:file_get_contents script

2 个答案:

答案 0 :(得分:0)

如果没有我们可以调查的任何链接,我猜有某种用户代理魔术正在进行中。

尝试用cURL欺骗它。

像这样:

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 OPR/20.0.1387.91');

您可以使用自己的用户代理或查找其他内容here

不是100%这是问题所在,但考虑到您提供的数据,这是我能想到的唯一解决方案。我相信你已经仔细检查了脚本等中的url等是否正确。

答案 1 :(得分:0)

找出问题并在此分享,供其他人注意:

第1课

  • file_get_contents不会将会话或cookie传递给URL,因此请勿使用它从会话或cookie依赖的URL中获取数据
  • cURL是你的朋友。您将必须构建完整的HTTP请求以传递适当的会话变量

第2课

  • 当通过浏览器访问时,会话相关脚本将正常运行,但通过file_get_contents或部分形成的cURL访问时则不行;

  • 列出项目

第3课

  • 当代码太琐碎而且有问题时,Devil就是细节 - 质疑每一个小函数(在这里为哲学内涵道歉:))




我创建的json_feed.php是依赖于会话的。所以当通过file_get_contents访问时它很顽皮。使用cURL也表现不佳。

我更改了cURL以包含此处提供的建议:Maintaining PHP session while accessing URL via cURL

我的最终cURL代码(工作如下):

$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';

session_write_close();

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );
curl_setopt($ch, CURLOPT_URL,$url);
$result = curl_exec($ch);
curl_close($ch);

我希望能节省一些时间。

感谢所有回复。