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。