首页 > 技术文章 > 【PHP】使用curl发送GET、POST、PUT、DELETE请求

guliang 2019-10-15 09:48 原文

如题,curl各种操作,封装为一个方法,一劳永逸

话不多说,直接上代;不能使用,提棍找我

<?php
/**
 * 发送http请求
 * @param string $url 请求地址
 * @param string $method http方法(GET POST PUT DELETE)
 * @param array $data http请求数据 array|string
 * @param array $header http请求头
 * @param Int   $type  请求数据类型 0-字符串  1-json  2-array
 * @param Int   $synchronous  请求数据类型 0-异步  1-同步
 * @return string|bool
 */
function send_request($url = '', $method = "POST", $data = array(), $header = array(), $type = 1, $synchronous = 1) {
    //控制请求方法范围
    $httpMethod = array('GET', 'POST', 'PUT', 'DELETE');
    $method = strtoupper($method);
    if (!in_array($method, $httpMethod)) {
        return false;
    }
    //请求头初始化
    $request_headers = array();
    $User_Agent = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31';
    $request_headers[] = 'User-Agent: '. $User_Agent;
    if($header){
        foreach ($header as $v) {
            $request_headers[] = $v;
        }
    }

    $request_headers[] = 'Accept: text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    switch ($method) {
        case "POST":
            $request_headers[] = "X-HTTP-Method-Override: POST";
            break;
        case "PUT":
            $request_headers[] = "X-HTTP-Method-Override: PUT";
            break;
        case "DELETE":
            $request_headers[] = "X-HTTP-Method-Override: DELETE";
            break;
        default:
            if($data) {
                //GET请求
                $url = $url . '?' . http_build_query($data);
            }
    }
    //发送http请求
    $ch = curl_init();
    if(!$synchronous) {
        //异步
        curl_setopt($ch, CURLOPT_TIMEOUT, 1);//设置超时时间为1秒,超过1秒则关闭连接
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);     //注意,毫秒超时一定要设置这个 cURL 7.10时被加入
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 300); //超时毫秒,cURL 7.16.2中被加入
    }else{
        //curl_setopt($ch, CURLOPT_TIMEOUT, 35); // 最大执行时间
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // 在尝试连接时等待的秒数,等待3s没有连接成功就断开
    }
    curl_setopt($ch, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($ch, CURLOPT_HEADER, 0);// 设置是否显示返回头信息  1返回 0不返回  调试开启
    curl_setopt($ch, CURLOPT_NOBODY, 0); //不想在输出中包含body部分,设置这个选项为一个非零值
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//获取的信息以文件流的形式返回
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); //在启用CURLOPT_RETURNTRANSFER的时候,返回原生的(Raw)输出。
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//https 不进行ssl验证
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);//设置头信息
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); //设置请求方式
    if($method == 'POST'){
        curl_setopt($ch, CURLOPT_POST, TRUE);
    }

    if($method != 'GET'){
        //格式化发送数据
        if($data) {
            if(is_array($data)) {
                if ($type == 0) {
                    //supportkb 接口需要
                    $dataValue = http_build_query($data);
                } elseif ($type == 1) {
                    $dataValue = json_encode($data, JSON_UNESCAPED_UNICODE);
                }else{
                    //post 数组
                    $dataValue = $data;
                }
            }else{
                $dataValue = $data;
            }
        }

        if(!empty($dataValue)) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $dataValue);
        }
    }

    //发送请求获取返回响应
    $result['data'] = curl_exec($ch);
    $result['httpCode'] = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    if(strlen(curl_error($ch))>1){
        $result = false;
    }

    curl_close($ch);
    return $result;
}


?>

 

推荐阅读