Loading

用PHP封装一个强大且通用的CURL方法

用PHP封装一个强大且通用的CURL方法

支持:get、post、put、delete、patch、options

/**
 * @function 强大且通用的cURL请求库
 * @param    $url            string        路径
 * @param    $method         string        请求方式   如:GET/POST/PUT/DELETE
 * @param    $data        array|string      荷载       如:['key1' => 'value1','key2' => 'value2']
 * @param    $request_header array         请求头     如: ['Content-Type' => 'application/x-www-form-urlencoded','Authorization'=>'Bearer YOUR_ACCESS_TOKEN']
 */
function curlRequest($url, $method = 'GET', $data = [], $headers = [], $options = [])
    {
        $data = is_array($data) ? http_build_query($data) : $data;
        // 初始化cURL会话
        $ch = curl_init($url);
        // 设置cURL选项
        curl_setopt($ch, CURLOPT_REFERER, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回原生的(Raw)输出而不是输出
        curl_setopt($ch, CURLOPT_HEADER, true); // 将头文件的信息一并输出
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动设置HTTP_REFERER并且获得新的URL

        // 设置请求方法
        switch (strtoupper($method)) {
            case 'GET':
                curl_setopt($ch, CURLOPT_HTTPGET, true);
                break;
            case 'POST':
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                break;
            case 'PUT':
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                break;
            case 'DELETE':
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
                if (!empty($data)) {
                    $url .= '?' . $data;
                }
                break;
            default:
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
                if (!empty($data)) {
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                }
                break;
        }
        // 添加HTTP头部
        if (!empty($headers)) {
            $headerArray = [];
            foreach ($headers as $key => $value) {
                $headerArray[] = "$key: $value";
            }
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
        }
        // 应用额外的选项
        foreach ($options as $key => $value) {
            curl_setopt($ch, $key, $value);
        }
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        // 执行cURL会话
        $response = curl_exec($ch);
        // 获取HTTP响应码
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        // 检查是否有cURL错误发生
        if (curl_errno($ch)) {
            throw new Exception(curl_error($ch));
        }
        // 关闭cURL会话
        curl_close($ch);
        // 分割响应头和响应体
        list($header, $body) = explode("\r\n\r\n", $response, 2);
        // 检查HTTP响应码
        if ($httpCode >= 400) {
            throw new Exception("HTTP error: $httpCode");
        }
        // 返回响应体
        return $body;
    }

 

posted @ 2025-02-25 09:12  Carvers  阅读(226)  评论(0)    收藏  举报