根据Google Custom Search API的说明,您可以使用REST界面的GET动词调用它,例如:
GET https://www.googleapis.com/customsearch/v1?key=INSERT-YOUR-KEY&cx=017576662512468239146:omuauf_lfve&q=lectures
我设置了我的API密钥和自定义搜索引擎,当我的测试查询直接粘贴在我的浏览器上时,它运行正常,我将JSON文件显示给我。
然后我尝试使用以下命令从我的PHP代码调用API:
$json = file_get_contents("$url") or die("failed");
其中$ url与浏览器上的相同,但我的PHP代码在尝试打开时死亡。
之后我尝试了curl,它起作用了。代码是这样的:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$body = curl_exec($ch);
问题:
答案 0 :(得分:12)
首先,您应该检查设置allow_url_fopen
,AFAIK这是file_get_contents()
不应该工作的唯一原因。同样弃用safe_mode
可能会导致此问题。
哦,根据您的评论,您必须在使用file system函数时将http://
添加到网址,它是wrapper告诉php您需要使用http请求,没有它功能认为您需要打开./google.com
(与google.txt
相同)。
是的,您可以使用套接字构建几乎任何cURL请求。
我个人认为你应该坚持使用cURL,因为:
答案 1 :(得分:5)
file_get_contents
可能会在获取IP后重写您的请求,获得与以下内容相同的内容:
file_get_contents("xxx.yyy.www.zzz/app1",...)
如果您在请求中进行IP寻址,许多服务器将拒绝您访问 使用cURL时,此问题不存在。它会在您设置时解析保留请求的主机名,因此服务器的响应并不粗鲁 这也可能是“原因”..
答案 2 :(得分:4)
1)为什么在拨打file_get_contents
时使用引号?
2)正如评论中提到的那样,file_get_contents
要求php.ini启用allow_url_fopen
。
3)您可以使用fsockopen
,但您必须手动处理HTTP请求/响应,这将是您在拥有cURL时重新发明轮子。 socket_create
也是如此。
4)关于这个问题的标题:对于复杂的HTTP事务,cURL可以更加自定义和有用,而不是file_get_contents
。但是,应该提到的是,使用stream contexts可以让您为file_get_contents
电话设置大量设置。但是,我认为cURL仍然更加完整,因为它可以让您使用multiple parallel handlers。