最近在對三方接口需要經常用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',
];