我一直想弄清楚两天为什么这不起作用。基本上我正在使用TradeMe的API,他们在这里有一个.json文件:
链接1:http://api.trademe.co.nz/v1/Listings/Latest.json
我没想用API速率限制,我认为没问题......我只是为我的网络服务器编写一个脚本来抓取这个文件并将其返回给我(我当然要在本地缓存它但我还没有还没完到那里。我们只是说我的抓取器URL是这样的:
链接2:http:// {我的网址} /trademe/fetcher.php?url=http://api.trademe.co.nz/v1/Listings/Latest.json
事情是...... cURL为链接2返回的内容不是链接1返回给我的!每次我运行我的脚本(链接2)时,它总是给我一个旧版本的链接1的JSON文件(我知道它是一个旧版本,因为我查看了JSON文件中的ListingId数字)。有时我运行链接2,它给了我一个更新的JSON,然后当我刷新脚本时,它再次给我更旧的JSON! (请注意,如果我直接在Chrome中访问链接1,它总会向我提供最新的JSON文件。我的脚本有问题吗?)
这是我的剧本:
<?php
set_time_limit(3600);
header("Content-Type: application/json");
header("Expires: on, 01 Jan 1970 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
$contents = curl_exec($ch);
curl_close($ch);
echo $contents;
?>
我基本上是通过jQuery的$ .getJSON来调用这个脚本。我甚至在我的index.php中放入了无缓存头文件,并放入$ .ajaxSetup({cache:false});但没有运气。
有什么想法吗?
(这可能会有所启发,但我还没有发现任何事情:http://developer.trademe.co.nz/api-overview/)
干杯
答案 0 :(得分:0)
我和TradeMe的其中一个人谈过,虽然我认为我们并没有真正弄清楚为什么链接1和链接2的行为不同,但解决办法是在URL上附加一些随机数(甚至是时间) ,所以例如:
http://api.trademe.co.nz/v1/Listings/Latest.json&t=RANDOM_NUMBER
然后在提取脚本或其他任何内容中使用它。
答案 1 :(得分:0)
至少我的Chrome版本默认发送max-age cache指令,我认为这是请求之间的差异。尝试在curl_exec
之前添加此内容:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Cache-Control:max-age=0'
));