我有一个特殊的问题。
我有一个获取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
答案 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课
第2课
当通过浏览器访问时,会话相关脚本将正常运行,但通过file_get_contents或部分形成的cURL访问时则不行;
列出项目
第3课
的解强>
我创建的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);
我希望能节省一些时间。
感谢所有回复。