php的curl请求,包含了post,get,put,delete

php的curl请求,包含了post,get,put,delete

这段代码是一个非常实用的HTTP通信工具,可以轻松集成到需要网络通信的PHP项目中。它提供了足够的灵活性,适合多种网络请求任务。

if (!function_exists("http_curl")) {
    /**
     * 发送HTTP请求
     * @param string $url 请求的URL
     * @param array $param 请求参数
     * @param bool $https 是否使用HTTPS
     * @param string $method 请求方法,支持 GET, POST, PUT, DELETE
     * @param array $header 用户自定义的HTTP头部
     * @param int $timeout 请求超时时间(秒)
     * @param int $connectTimeout 连接超时时间(秒)
     * @param bool $followRedirects 是否跟随重定向
     * @return array 包含响应结果、HTTP状态码和其他信息的数组
     */
    function http_curl(
        string $url,
        array $param = [],
        bool $https = false,
        string $method = 'GET',
        array $header = [],
        int $timeout = 30,
        int $connectTimeout = 10,
        bool $followRedirects = false
    ) {
        $ch = curl_init();
        if (!$ch) {
            return ['success' => false, 'error' => '无法初始化cURL会话'];
        }

        // 准备URL和方法
        $url = prepareUrl($url, $param, $method);
        curl_setopt_array($ch, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => $timeout,
            CURLOPT_CONNECTTIMEOUT => $connectTimeout,
            CURLOPT_FOLLOWLOCATION => $followRedirects,
            CURLOPT_SSL_VERIFYPEER => $https,
            CURLOPT_HTTPHEADER => prepareHeaders($header, $param, $method)
        ));

        // 设置请求特定的选项
        if (in_array(strtoupper($method), ['POST', 'PUT', 'DELETE'])) {
            $contentType = array_reduce($header, function ($carry, $item) {
                if (strpos($item, 'Content-Type:') === 0) {
                    return trim(substr($item, strpos($item, ':') + 1));
                }
                return $carry;
            }, 'application/json');

            $payload = ($contentType == 'application/json') ? json_encode($param, JSON_UNESCAPED_UNICODE) : $param;
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
            curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        }

        $result = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($result === false) {
            $error = curl_error($ch);
            $result = ['success' => false, 'error' => $error, 'http_code' => $httpCode];
        } else {
            $result = ['success' => true, 'data' => $result, 'http_code' => $httpCode];
        }
        curl_close($ch);
        return $result;
    }

    /**
     * 根据方法和参数准备URL
     * @param string $url 原始URL
     * @param array $param 参数数组
     * @param string $method HTTP方法
     * @return string 调整后的URL
     */
    function prepareUrl($url, $param, $method) {
        if ($method === 'GET' && !empty($param)) {
            $url .= (strpos($url, '?') === false ? '?' : '&') . http_build_query($param);
        }
        return $url;
    }

    /**
     * 准备请求头
     * @param array $headers 用户自定义的头部数组
     * @param array $param 请求的参数,用于确定内容长度
     * @param string $method HTTP方法
     * @return array 处理后的头部数组
     */
    function prepareHeaders($headers, $param, $method) {
        $contentTypeSet = false;
        foreach ($headers as $header) {
            if (strpos($header, 'Content-Type:') === 0) {
                $contentTypeSet = true;
                break;
            }
        }

        if (!$contentTypeSet && in_array(strtoupper($method), ['POST', 'PUT', 'DELETE'])) {
            $headers[] = 'Content-Type: application/json';
            $headers[] = 'Content-Length: ' . strlen(json_encode($param));
        }

        return $headers;
    }
}

调用案例

// 示例调用
$response = http_curl(
    "https://api.example.com/data",
    ['key' => 'value'],
    true,
    'POST',
  ['Authorization: Bearer your_access_token'],
    30,
    15,
    true
);
// 打印响应内容
print_r($response);

代码说明

这段PHP代码定义了一个名为http_curl的函数,用于发送HTTP请求到指定的URL,并处理这些请求的响应。这个函数提供了灵活性来调整各种HTTP请求的参数,包括请求方法、超时时间、是否跟随重定向等。以下是对函数和它的各个部分的详细介绍:
函数定义

函数名: http_curl
参数:
    string $url: 请求的目标URL。
    array $param = []: 发送请求时用的参数数组,缺省为一个空数组。
    bool $https = false: 指示是否使用HTTPS进行请求,默认为false。
    string $method = 'GET': HTTP请求方法,默认为GET。支持GET, POST, PUT, DELETE。
    array $header = []: 用户自定义的HTTP头部数组,默认为空数组。
    int $timeout = 30: 请求的超时时间,默认为30秒。
    int $connectTimeout = 10: 连接的超时时间,默认为10秒。
    bool $followRedirects = false: 是否自动跟随HTTP重定向,默认为false。

函数体

初始化: 使用curl_init初始化cURL会话。

准备URL: 通过调用prepareUrl函数,根据HTTP方法和提供的参数来准备或修改URL。

设置cURL选项:
    CURLOPT_URL: 设置请求的URL。
    CURLOPT_RETURNTRANSFER: 设置为true以返回请求的结果而非直接输出。
    CURLOPT_TIMEOUT 和 CURLOPT_CONNECTTIMEOUT: 分别设置请求和连接的超时时间。
    CURLOPT_FOLLOWLOCATION: 设置是否跟随重定向。
    CURLOPT_SSL_VERIFYPEER: 根据$https参数确定是否验证对等证书。
    CURLOPT_HTTPHEADER: 使用prepareHeaders函数准备HTTP头部。

设置请求方法和负载:
    如果方法是POST, PUT, DELETE,则设置CURLOPT_CUSTOMREQUEST为相应的方法,并准备负载(参数),这取决于Content-Type。

执行请求:
    使用curl_exec执行cURL请求。
    获取HTTP状态码。
    检查是否有错误,如果有,返回错误信息和状态码。

关闭cURL会话:
    使用curl_close结束cURL会话。

结果返回

函数返回一个数组,包含是否成功的标志、数据(或错误信息)、HTTP状态码等。
辅助函数

prepareUrl: 根据方法和参数调整URL。
prepareHeaders: 准备HTTP头部,自动添加内容类型和内容长度,如果请求方法为POST, PUT, DELETE且未设置Content-Type。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值