自己封装了一个比较完善的curl请求函数,兼容get和post,内容格式兼容json和x-www-form-urlencoded,兼容http和https。而且写了非常详细的注释,需要的人可以根据注释,自定义修改代码,达到想要的效果。环境要求PHP7
直接上代码
if (!function_exists('curl_request')) {
/**
* Notes: curl发送http请求
* User: 夜雨闻铃
* @param string $url 请求的url
* @param bool $is_post 是否为post请求
* @param array $data 请求参数
* @param array $header 请求头 说明:应这样格式设置请求头才生效 ['Authorization:0f5fc4730e21048eae936e2eb99de548']
* @param bool $is_json 是否为json请求,默认为Content-Type:application/x-www-form-urlencoded
* @param int $time_out 超时时间 单位秒,0则永不超时
* @return mixed
*/
function curl_request(string $url, bool $is_post = true, array $data = [], array $header = [], bool $is_json = false, int $time_out = 0)
{
if (empty($url)) {
return false;
}
//初始化curl
$curl = curl_init();
//如果curl版本,大于7.28.1,得是2才行 。 而7.0版本的php自带的curl版本为7.40.1. 使用php7以上的,就能确保没问题
$ssl = (strpos($url,'https') !== false) ? 2 : 0;
$options = [
//设置url
CURLOPT_URL => $url,
//将头文件的信息作为数据流输出
CURLOPT_HEADER => false,
// 请求结果以字符串返回,不直接输出
CURLOPT_RETURNTRANSFER => true,
// 禁止 cURL 验证对等证书
CURLOPT_SSL_VERIFYPEER => false,
//identity", "deflate", "gzip“,三种编码方式,如果设置为空字符串,则表示支持三种编码方式。当出现乱码时,可设置此字符串
CURLOPT_ENCODING => '',
//设置http版本。HTTP1.1是主流的http版本
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
//连接对方主机时的最长等待时间。设置为10秒时,如果对方服务器10秒内没有响应,则主动断开链接。为0则,不限制服务器响应时间
CURLOPT_CONNECTTIMEOUT => $time_out,
//整个cURL函数执行过程的最长等待时间,也就是说,这个时间是包含连接等待时间的
CURLOPT_TIMEOUT => 0,
//检查服务器SSL证书中是否存在一个公用名
CURLOPT_SSL_VERIFYHOST => $ssl,
//设置头信息
CURLOPT_HTTPHEADER => $header
];
//post和get特殊处理
if ($is_post) {
// 设置POST请求
$options[CURLOPT_POST] = true;
if ($is_json && $data) {
//json处理
$data = json_encode($data);
$header = array_merge($header, ['Content-Type: application/json']);
//设置头信息
$options[CURLOPT_HTTPHEADER] = $header;
//如果是json字符串的方式,不能用http_build_query函数
$options[CURLOPT_POSTFIELDS] = $data;
} else {
//x-www-form-urlencoded处理
//如果是数组的方式,要加http_build_query,不加的话,遇到二维数组会报错。
$options[CURLOPT_POSTFIELDS] = http_build_query($data);
}
} else {
// GET
$options[CURLOPT_CUSTOMREQUEST] = 'GET';
//没有?且data不为空,将参数拼接到url中
if (strpos($url,'?') === false && !empty($data) && is_array($data)) {
$params_arr = [];
foreach ($data as $k => $v) {
array_push($params_arr,$k . '=' . $v);
}
$params_string = implode('&',$params_arr);
$options[CURLOPT_URL] = $url . '?' . $params_string;
}
}
//数组方式设置curl,比多次使用curl_setopt函数设置在速度上要快
curl_setopt_array($curl,$options);
// 执行请求
$response = curl_exec($curl);
//返回的CONTENT_TYPE类型
$content_type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
//返回的http状态码
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
//没有错误时curl_errno返回0
if (curl_errno($curl) == 0) {
$result = [
'HTTP_MSG' => 'SUCCESS',
'HTTP_BODY' => json_decode($response, true),
'HTTP_HEADER' => $content_type,
'HTTP_CODE' => $http_code,
];
} else {
$result = [
'HTTP_MSG' => curl_error($curl),
'HTTP_BODY' => null,
'HTTP_HEADER' => $content_type,
'HTTP_CODE' => $http_code,
];
}
//关闭请求
curl_close($curl);
return $result;
}
}
除了可以请求别人的接口数据。还可以拉去别人生成的文件。比如别人的url是http://47.97.185.90:8060/demo...,把返回的内容result['HTTP_BODY']通过file_put_contents($file_name, result['HTTP_BODY'])写到自己对应的目录即可。
本文为夜雨闻铃原创文章,转载无需和我联系,但请注明文章出处。文章出处:夜雨闻铃的思否文章(https://segmentfault.com/u/ye...)