在PHP实际开发过程中,经常需要与别人合作对接,这时候就有可能需要访问他人接口来进行数据的获取,这里特指是在同一网络下,不需要进行跨网闸的操作。现在,就需要方法来请求他人接口。
请求一般分为get和post请求,请求输入参数一般也会做出限制,有可能为json格式,或者xml格式,这里以json格式为例。
get请求:
/**
* GET 请求
* @param string $url 请求接口地址
*/
function http_get($url)
{
$oCurl = curl_init();
if (stripos($url, "https://") !== FALSE) {
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($oCurl, CURLOPT_VERBOSE, 1);
curl_setopt($oCurl, CURLOPT_HEADER, 1);
// $sContent = curl_exec($oCurl);
// $aStatus = curl_getinfo($oCurl);
$sContent = execCURL($oCurl);
curl_close($oCurl);
return $sContent;
}
post请求:
/**
* POST 请求
* @param string $url 请求接口地址
* @param array $param 请求参数
* @param boolean $post_file 是否文件上传
* @return string content
*/
function http_post($url,$param,$post_file=false){
$oCurl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
if(PHP_VERSION_ID >= 50500 && class_exists('\CURLFile')){
$is_curlFile = true;
}else {
$is_curlFile = false;
if (defined('CURLOPT_SAFE_UPLOAD')) {
curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false);
}
}
if($post_file) {
if($is_curlFile) {
foreach ($param as $key => $val) {
if(isset($val["tmp_name"])){
$param[$key] = new \CURLFile(realpath($val["tmp_name"]),$val["type"],$val["name"]);
}else if(substr($val, 0, 1) == '@'){
$param[$key] = new \CURLFile(realpath(substr($val,1)));
}
}
}
$strPOST = $param;
}else{
$strPOST = json_encode($param);
//echo $strPOST;die;
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($oCurl, CURLOPT_POST,true);
curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
curl_setopt($oCurl, CURLOPT_VERBOSE, 1);
curl_setopt($oCurl, CURLOPT_HEADER, 1);
// $sContent = curl_exec($oCurl);
// $aStatus = curl_getinfo($oCurl);
$sContent = execCURL($oCurl);
curl_close($oCurl);
return $sContent;
}
curl请求:
/**
* 执行CURL请求,并封装返回对象
*/
function execCURL($ch)
{
$response = curl_exec($ch);
$error = curl_error($ch);
$result = array('header' => '',
'content' => '',
'curl_error' => '',
'http_code' => '',
'last_url' => '');
if ($error != "") {
$result['curl_error'] = $error;
return $result;
}
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$result['header'] = str_replace(array("\r\n", "\r", "\n"), "<br/>", substr($response, 0, $header_size));
$result['content'] = substr($response, $header_size);
$result['http_code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result['last_url'] = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$result["base_resp"] = array();
$result["base_resp"]["ret"] = $result['http_code'] == 200 ? 0 : $result['http_code'];
$result["base_resp"]["err_msg"] = $result['http_code'] == 200 ? "ok" : $result["curl_error"];
return $result;
}
这里说明一下json_encode和json_decode函数。json_encode — 对变量进行 JSON 编码,json_decode — 对 JSON 格式的字符串进行解码,详细情况可以查找php手册。
这声明完这两个函数之后,在需要CURL请求的地方调用函数就可以了。这就是请求他人接口的基本方法,希望可以帮到大家,谢谢。