PHP使⽤CURL模拟post/get请求
废话少说 先上代码
一 : 实现方法
1.POST
/** *Send array into HTTP post request */ // function curlPost($url, $post_data = array(), $timeout = 5, $header = "", $data_type = "") { $header = empty($header) ? '' : $header; //⽀持json数据数据提交 if($data_type == 'json'){ $post_string = json_encode($post_data); }elseif($data_type == 'array') { $post_string = $post_data; }elseif(is_array($post_data)){ $post_string = http_build_query($post_data, '', '&'); } $ch = curl_init(); // 启动⼀个CURL会话 curl_setopt($ch, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查 // https请求不验证证书和hosts curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在 curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟⽤户使⽤的浏览器 //curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使⽤⾃动跳转 //curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // ⾃动设置Referer curl_setopt($ch, CURLOPT_POST, true); // 发送⼀个常规的Post请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); // Post提交的数据包 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); // 设置超时限制防⽌死循环 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //curl_setopt($curl, CURLOPT_HEADER, 0); // 显⽰返回的Header区域内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取的信息以⽂件流的形式返回 curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //模拟的header头 $result = curl_exec($ch); // 打印请求的header信息 //$a = curl_getinfo($ch); //var_dump($a); curl_close($ch); return$result; }
2.GET
/** * 传入json数据进行HTTP Get请求 * * @param string $url $data_string * @return string */ function curlGet($url) { $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在 $tmpInfo = curl_exec($curl); //返回api的json对象 //关闭URL请求 curl_close($curl); return $tmpInfo; //返回json对象 }
二 : 应用场景 / 使用示例
我们有的时候想爬取点数据,但是网站做了防护,用file_get_contents的话,就会提示无法读取。所以得想点其他方法了,所以就想到了利用php 的curl 模拟post或者get请求
使用示例如下
curlPost 依次传入 =》请求路径,携带参数,超时时间,请求头信息,返回格式
curlGet 仅需传入 =》请求路径即可
三 : 经验总结
1、无论“Content type: multipart / form data" 还是"Content type: application / x-www-form-urlencoded”,只要数据以“post”模式发送,并且在body
体中的数据是数组格式,那么在接收端就可以使⽤$_POST获取到。
2. 在接收端使⽤file_get_contents("php://input")接收时,只能获取到字符串类型的body体数据。
3. 请求时,在header中添加的参数xxx,在接收端可以使⽤$_SERVER["HTTP_XXX"]进⾏获取。