封装好的PHP用curl发送http请求 GET和POST通用 超好用

夜雨闻铃

自己封装了一个比较完善的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...)

阅读 349

分享和记录自己成长之路遇到学习到的经验和遇到的坑(偏php和go)。为了更好更活跃的社区,尽一份自己的微...

12 声望
1 粉丝
0 条评论
你知道吗?

分享和记录自己成长之路遇到学习到的经验和遇到的坑(偏php和go)。为了更好更活跃的社区,尽一份自己的微...

12 声望
1 粉丝
宣传栏