我的代码正在使用file_get_contents()
向API端点发出GET请求。看起来它正在使用HTTP/1.0
,我的系统管理员说我需要使用HTTP/1.1
。如何发出HTTP/1.1
请求?我需要使用卷曲还是有更好/更简单的方法?
我决定使用cURL,因为我使用的是PHP 5.1.6。我最终通过执行此操作强制执行HTTP / 1.1:
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
如果我使用的是5.3或更高版本,我会尝试这样做:
$ctx = stream_context_create(array(
'http' => array('timeout' => 5, 'protocol_version' => 1.1)
));
$res = file_get_contents($url, 0, $ctx);
echo $res;
http://us.php.net/manual/en/context.http.php
注意:5.3.0之前的PHP没有 实现分块传输解码。 如果此值设置为1.1,则为您的值 责任是1.1合规。
我发现可能提供HTTP / 1.1的另一个选项是使用HTTP extension
答案 0 :(得分:3)
在任何一种情况下我都会使用cURL,它会为您提供更多控制权,特别是它会为您提供超时选项。这在调用外部API时非常重要,以便在远程API关闭时不允许应用程序冻结。
可以这样:
# Connect to the Web API using cURL.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.url.com/api.php?123=456');
curl_setopt($ch, CURLOPT_TIMEOUT, '3');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xmlstr = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
cURL将默认使用HTTP / 1.1,除非您使用curl_setopt($s,CURLOPT_HTTPHEADER,$headers);
指定其他内容,其中$ headers是一个数组。
答案 1 :(得分:2)
正如其他想要使用stream_context_create / file_get_contents的人所知,如果您的服务器配置为使用keep-alive连接,则响应将不会返回,您需要添加'protocol_version' => 1.1
以及{{1} }。
以下示例:
'header' => 'Connection: close'