首页 > 解决方案 > PHP cURL 响应标头

问题描述

我第一次尝试 HTTP 请求(也使用 PostMan)。在那里,一切正常。使用 PHP cURL 导出它时,我得到以下信息:

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "htt..",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_HTTPHEADER => array(
    "Authorization: Basic ..."
  ),
));

$response = curl_exec($curl);

curl_close($curl);

我期待响应标头中有一个键,因此我试图将响应标头作为变量(首选数组)。我该怎么做?到目前为止,我没有运气尝试使用以下内容:

$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

感谢您提前提供任何帮助。

编辑1:

使用https://incarnate.github.io/curl-to-php/我将 Postman cURL 命令转换为 PHP cURL(而不是使用 Postman 的生成器)并得到以下内容,这似乎有效:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'htt..');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //manually added
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //manually added
curl_setopt($ch, CURLOPT_HEADER, 1); //manually added

$headers = array();
$headers[] = 'Authorization: Basic ...';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$body = substr($result, $header_size);

curl_close($ch);
echo $header;

标签: phpcurl

解决方案


你真的很接近解决这个问题,但你需要将它设置CURLOPT_HEADER为 true 来检索标题。此更改应该有效:

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "htt..",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HEADER => true, 
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_HTTPHEADER => array(
    "Authorization: Basic ..."
  ),
));

$response = curl_exec($curl);
if (curl_errno($curl) !== CURLE_OK) {
    throw new \RuntimeException("curl_exec error: " . curl_error($ch) . ": " . curl_error($ch));
}

$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

curl_close($curl);

推荐阅读