PHP支持CURL库,利用URL语法规定来传输文件和数据的工具,支持很多协议,包括HTTP、FTP、TELNET等.
优点:是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS.CURL可以根据URL前缀是'HTTP'还是'HTTPS'自动选择是否加密发送内容.还可以解决跨域问题等.
PHP建立CURL请求的基本步骤:
1:初始化 curl_init() 2:设置curl选项 curl_setopt() 3:执行并获取结果 curl_exec() 4:关闭释放资源 curl_close()
curl抓取百度网站示例demo:
1 <?php 2 //初始化curl资源 3 $ch = curl_init(); 4 5 //设置URL和相应的选项 6 curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/"); 7 //设置头文件的信息作为数据流输出 8 curl_setopt($ch, CURLOPT_HEADER, 1); 9 10 //执行命令,并获取结果 11 curl_exec($ch); 12 13 //关闭curl资源,释放系统资源 14 curl_close($ch);
项目中比较常用到的是对回调数据接口处理.封装的方法支持post和get请求方法.数据传输包含urldecode和json.
1 <?php 2 class HttpClient 3 { 4 /* 5 *get请求 urldecode数据传输(支持http和https) 6 *@param $url接口地址 string 7 *@param $headers请求报文头body数据 array 8 *@return type 9 * */ 10 public static function get($url, $headers = array()) 11 { 12 $ch = curl_init(); //初始化 13 if (strpos($url, 'https') === 0) 14 { 15 //当请求https的数据时,会要求证书,这时候,加上下面这两个参数,规避ssl的证书检查 16 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //https请求 不验证证书和hosts 17 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 18 } 19 if (!empty($headers)) 20 { 21 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //设置http头部 22 } 23 curl_setopt($ch, CURLOPT_URL, $url); //设置获取的url地址 24 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设置获取的信息以文件流的形式返回 25 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); //连接超时(秒) 26 curl_setopt($ch, CURLOPT_TIMEOUT, 4); //执行超时(秒) 27 28 $outPut = curl_exec($ch); //执行命令,并获取结果 29 curl_close($ch); //关闭curl资源,释放系统资源 30 31 return $outPut; 32 } 33 34 /* 35 *post请求 urldecode数据传输(支持http和https) 36 *@param $url接口地址 string 37 *@param $data接口参数 array 38 *@param $headers请求报文头body数据 array 39 *@return type 40 * */ 41 public static function post($url, array $data, $headers = array()) 42 { 43 $ch = curl_init(); //初始化 44 if (strpos($url, 'https') === 0) { 45 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 46 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 47 } 48 if (!empty($headers)) 49 { 50 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //设置http头部 51 } 52 53 curl_setopt($ch, CURLOPT_URL, $url); //设置获取的url地址 54 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设置获取的信息以文件流的形式返回 55 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); //连接超时(秒) 56 curl_setopt($ch, CURLOPT_TIMEOUT, 4); //执行超时(秒) 57 curl_setopt($ch, CURLOPT_POST, 1); //设置post方式提交 58 //注意: 传递一个URL-encoded字符串,数据会被编码成 application/x-www-form-urlencoded,传递一个数组到CURLOPT_POSTFIELDS,curl会把数据编码成 multipart/form-data 59 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 60 61 $outPut = curl_exec($ch); //执行命令,并获取结果 62 curl_close($ch); //关闭curl资源,释放系统资源 63 64 return $outPut; 65 } 66 67 /* 68 *post请求 json数据传输(支持http和https) 69 *@param $url接口地址 string 70 *@param $data接口参数 array或json_encode过的数据 71 *@return type 72 * */ 73 public static function postJson($url, $data) 74 { 75 if (is_array($data)) { 76 $data = json_encode($data); 77 } 78 79 $ch = curl_init(); 80 if (strpos($url, 'https') === 0) { 81 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 82 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 83 } 84 85 curl_setopt($ch, CURLOPT_HTTPHEADER, array( 86 'Content-Type: application/json; charset=utf-8', 87 'Content-Length: ' . strlen($data) 88 ) 89 ); 90 curl_setopt($ch, CURLOPT_URL, $url); 91 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 92 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); 93 curl_setopt($ch, CURLOPT_TIMEOUT, 4); 94 curl_setopt($ch, CURLOPT_POST, 1); 95 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 96 97 $outPut = curl_exec($ch); 98 curl_close($ch); 99 100 return $outPut; 101 } 102 }
请求get和post方法实例:
1 //GET请求方法 2 $params = [ 3 'id' => 1, 4 'token' => '****' 5 ]; 6 $query = http_build_query($params); 7 $url = 'http://url地址' . '?' . $query; 8 $res = HttpClient::get($url); 9 $data = json_decode($res, true); 10 11 12 //POST请求方法 13 $params = [ 14 'id' => 1, 15 'token' => '****' 16 ]; 17 $url = 'http://url地址'; 18 $res = HttpClient::post($url, $params); 19 $data = json_decode($res, true);