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"]进⾏获取。

posted @ 2022-07-05 10:17  芒果鱼  阅读(394)  评论(0编辑  收藏  举报