SO PHP有一个curl界面,我可以连接,发布和下载内容。 我也可以
CURLOPT-HEADER
获取响应标头,并将其他选项设置为true。curl_getinfo
但我如何获取X-XYZ
响应标题?
例如,API可能会向我发送有关密钥是否有效/已使用
的信息通过
X-ERROR
X-ERROR-CODE
不幸的是,我无法获取这些标题/无法找到它。
我可以将CURLOPT_HEADER
设置为TRUE
,然后执行CURL,
但是,我需要具有相同访问令牌的重复请求/帖子
API的性质限制了令牌在单一用途中的使用。
对于那些可能会建议curlopt_header
的人,请注意
我使用令牌一次,将该选项设置为true,并且我耗尽了API令牌。
我无法重复使用令牌,以便接下来发出实际请求。
如果PHP CURL有一个选项,在curl_getinfo的响应中包含这些X-XYZ标题,那么,这样的功能将是有用的
@billynoah写了一个绝对的宝石。请参阅下文。您可以使用写回标头的功能,也可以编写自己的功能。但
TL; DR
USE
curl_setopt(<your-curl-handle>, CURLOPT_HEADERFUNCTION, <your-custom-header-collector-function>);
答案 0 :(得分:0)
我使用此函数来获取和解析卷曲响应中的标题 - 这是一个示例:
$headers = array();
$url = 'http://stackoverflow.com/questions/43535006/php-fetch-the-x-error-xxx-response-headers-with-curl';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'readHeader');
$result = curl_exec($curl);
print_r($headers);
curl_close($curl);
function readHeader($ch, $header) {
global $headers;
if (trim($header)) {
$parts = explode(':',$header,2);
$parts = array_map('trim',$parts);
if (count($parts) == 2) {
$headers[$parts[0]] = $parts[1];
} else if (!isset($headers['http_code'])) {
$headers['http_code'] = trim($header);
} else {
$headers[] = trim($header);
}
}
return strlen($header);
}
<强>响应:强>
Array
(
[http_code] => HTTP/1.1 200 OK
[Content-Type] => text/html; charset=utf-8
[X-Frame-Options] => SAMEORIGIN
[X-Request-Guid] => 9df57b2d-df0a-4902-93f6-1dca0faab9d5
[Content-Length] => 73067
[Accept-Ranges] => bytes
[Date] => Fri, 21 Apr 2017 06:33:33 GMT
[Via] => 1.1 varnish
[Age] => 0
[Connection] => keep-alive
[X-Served-By] => cache-jfk8122-JFK
[X-Cache] => MISS
[X-Cache-Hits] => 0
[X-Timer] => S1492756414.633607,VS0,VE15
[Vary] => Fastly-SSL
[X-DNS-Prefetch-Control] => off
[Set-Cookie] => prov=3cecd5a6-44ca-d63a-439e-921bc200d61d; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
[Cache-Control] => private
)
如您所见,结果数组中存在所有X-
标题,我们可以一次性查看它们以及响应。