PHP cURL获取HTTP响应头

前言

平时做开发时,经常会用到PHP的cURL扩展,用于请求外部HTTP接口。大多数情况下,我们只需要获取接口返回的响应体(HTTP response body),但如果我们想获取响应头(HTTP response header)那可以怎么做呢?

可惜的是,cURL扩展没有提供原生的方法让我们(以数组的形式)直接获取响应头,只能通过稍微复杂一点的方法来获取。

实现

代码1(适用于PHP 7.3及以上版本):

<?php
function headerHandler($curl, $headerLine) {
    $len = strlen($headerLine);
    // HTTP响应头是以:分隔key和value的
    $split = explode(':', $headerLine, 2);
    if (count($split) > 1) {
        $key = trim($split[0]);
        $value = trim($split[1]);
        // 将响应头的key和value存放在全局变量里
        $GLOBALS['G_HEADER'][$key] = $value;
    }
    return $len;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.baidu.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerHandler"); // 设置header处理函数
$responseBody = curl_exec($ch);
if (curl_errno($ch)) {
    exit("发生错误:" . curl_error($ch));
}
curl_close($ch);

var_dump($GLOBALS['G_HEADER']); // 以数组形式打印响应头
var_dump($responseBody); // 打印响应体

代码2(适用于PHP 7.2及以下版本):

<?php

function headerHandler($headerStr) {
    $headerArr = explode("\r\n", $headerStr);
    if (empty($headerArr)) {
        return [];
    }

    $ret = [];
    foreach ($headerArr as $headerLine) {
        // HTTP响应头是以:分隔key和value的
        $split = explode(':', $headerLine, 2);
        if (count($split) > 1) {
            $key = trim($split[0]);
            $value = trim($split[1]);
            $ret[$key] = $value;
        }
    }

    return $ret;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.baidu.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$responseContent = curl_exec($ch);
if (curl_errno($ch)) {
    exit("发生错误:" . curl_error($ch));
}
// 截取响应头字符串,并转换为数组形式
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headerStr = mb_substr($responseContent, 0, $headerSize);
$responseHeader = headerHandler($headerStr);

curl_close($ch);

$responseBody = mb_substr($responseContent, $headerSize);
var_dump($responseHeader);  // 以数组形式打印响应头
var_dump($responseBody); // 打印响应体

打印出来的百度返回的响应头:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值