動態

詳情 返回 返回

通用curl發送請求方法 - 動態 詳情

最近在對三方接口需要經常用curl發送請求, 特別是post請求的時候要求各自格式的body,下面總結了一個curl請求模板

public static function curlRequest($url, array $paramsArr, $method = 'post', $contentType = 'urlencoded', $header = [])
    {
        $paramsArr = array_filter($paramsArr);//過濾空值
        $protocol = substr($url, 0, 5);
        $ch = curl_init();
        if ($method == 'post') {
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, 1);
            switch ($contentType) {
                case 'urlencoded':
                    $params = http_build_query($paramsArr);//urlencoded格式
                    $header[] = 'Content-Type: application/x-www-form-urlencoded';
                    break;
                case 'json':
                    $params = json_encode($paramsArr);//json格式
                    $header[] = 'Content-Type: application/json';
                    break;
                default://默認form-data格式
                    $params = $paramsArr;//form-data格式直接傳遞關聯數組
                    $header[] = 'Content-Type: multipart/form-data';
                    break;
            }
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        } else {
            if (!$paramsArr) {
                $getUrl = $url;
            } else {
                $params = http_build_query($paramsArr);
                $getUrl = $url . (stripos($url, "?") === false ? "?" : "&") . $params;
            }
            curl_setopt($ch, CURLOPT_URL, $getUrl);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if ('https' == $protocol) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        $res = curl_exec($ch);
        curl_close($ch);
        //返回數組格式
        return json_decode($res, true);             
    }

設置header參數的時候注意傳遞$header的內容格式

正確的$header格式(索引數組):

$headers = [        
            'Accept: application/json',
            'Content-Type: application/json; charset=utf-8',           
            'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
        ];

錯誤的$header格式(關聯數組)

之前有次按照php關聯數組的格式設置$header但是一直沒有起作用, 後來發現是傳遞的$header格式異常:

$headers = [
            'Accept' => 'application/json',
            'Content-Type' => 'application/json; charset=utf-8', 
];

user avatar lvweifu 頭像
點贊 1 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.