首页 > 编程语言 >用PHP封装一个强大且通用的cURL方法

用PHP封装一个强大且通用的cURL方法

时间:2023-08-09 12:01:39浏览次数:50  
标签:封装 setopt method header cURL PHP curl CURLOPT

用PHP封装一个强大且通用的cURL方法。
用PHP封装一个强大且通用的cURL方法。
用PHP封装一个强大且通用的cURL方法。
用PHP封装一个强大且通用的cURL方法。

/**
 * @function 强大且通用的cURL请求库
 * @param    $url            string        路径       如:https://example.com/a/b?key=val&k=>v
 * @param    $method         string        请求方式   如:get、post、put、delete、patch、options
 * @param    $payload        array|string  荷载       如:['foo' => 'bar', 'upload_file' => new CURLFile(file_path)]或json{"foo":"bar"}
 * @param    $request_header array         请求头     如:['Content-Type' => 'json', 'Set-Cookie' => 'foo']
 * @param    $time_out       int           超时秒数   如:10,(单位:秒)
 * @return   array [bool 请求是否成功, string 错误内容, [int http状态码, array 响应头, string 响应主体内容]];
 */
function curl($url, $method = 'GET', $payload = [], $request_header = [], $time_out = 10) {
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL, $url);

    $method = strtoupper($method);
    if ($method == 'POST') {
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'PUT') {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'DELETE') {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
        curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'PATCH') {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
        curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'OPTIONS') {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'OPTIONS');
        curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if($method == 'HEAD') {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');
    } else {
        curl_setopt($curl, CURLOPT_HTTPGET, true);
    }

    if ((parse_url($url)['scheme'] ?? '') == 'https') {
        //防止对12306类似的使用自家的ssl证书,造成的请求失败
        //禁止验证对等证书
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        //禁止验证主机证书
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }

    if ($time_out) {
        curl_setopt($curl, CURLOPT_TIMEOUT, $time_out);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $time_out);
    }

    if ($request_header) {
        //追加请求头 配置curl内容
        curl_setopt($curl, CURLOPT_HTTPHEADER, array_map(function ($key, $value) {return $key . ': ' . $value;}, array_keys($request_header), $request_header));
    }

    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLINFO_HEADER_OUT, true);
    curl_setopt($curl, CURLOPT_VERBOSE, true);
    $response    = curl_exec($curl);
    $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $http_code   = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $body        = substr($response, $header_size);
    $header_str  = trim(substr($response, 0, $header_size));
    $header = [];

    if($header_str) {
        $header_arr  = explode("\r\n", $header_str);
        foreach($header_arr as $every_header) {
            $header_temp = explode(': ', $every_header, 2);
            if(count($header_temp) == 2) {
                $header[$header_temp[0]] = $header_temp[1];
            }
        }
    }

    if (curl_errno($curl)) {
        return ['status' => false, 'msg'  => curl_error($curl), 'data' => []];
    }

    curl_close($curl);

    return ['status' => true, 'msg'  => '', 'data' => ['http_code' => $http_code, 'body' => $body, 'header' => $header]];
}

标签:封装,setopt,method,header,cURL,PHP,curl,CURLOPT
From: https://www.cnblogs.com/phpphp/p/17616492.html

相关文章

  • loguru进一步封装解决打印日志定位异常问题
    importosimportsysimporttimefromloguruimportloggerimportinspectdefcreat_time_os():creat_time=time.strftime("%Y-%m-%d",time.localtime())sys.path.append(os.path.dirname(os.path.abspath(__file__)))log_path_dir=os.......
  • docker部署php7.3+nginx
    1.拉取php+nginx镜像dockerpullphp:7.3.24-fpm-stretchdockerpullnginx:latest 2.启动PHP:dockerrun-d-v/var/www/test:/var/www/html-p9000:9000--namexy_phpfpmphp:7.3.24-fpm-stretch 参数说明-d让容器在后台运行-p添加主机到容器的端口映射-......
  • 基于php的动漫网站设计
    本网站开发采用PHP编程语言和MySQL作为后台数据库进行开发,利用VScode作为集成开发,基于PHP的动漫网站主要面向普通用户和管理员用户,通过调查分析,系统主要的功能需求如下:1、动漫栏目管理:实现动漫栏目信息的添加、修改、删除和查询2、动漫资源管理:实现动漫资源信息的添加、修改、删除......
  • vue3 + ElementPlus 封装函数式弹窗组件
    需求场景:弹窗组件需要支持自定义的插槽内容,删除的弹窗也要使用这个组件,只是样式不一样而已,希望在父组件使用删除弹窗的时候直接调用某个方法就可以显示弹窗组件模拟cuDialog假设我的弹窗组件有以下的props和事件dialogVisible:控制弹窗显示和隐藏title:弹窗的标题showClose......
  • JavaSE--封装
    一、封装概念及作用1、封装  现实生活中很多都是封装的,例如手机、笔记本电脑......外部有一个壳子保护内部的部件,保证内部的部件是安全的  封装之后对于我们使用者来说不需要了解内部的结构和关心内部的复杂,只需要使用就可以2、封装的作用保证内部结构的安全屏蔽复杂,暴......
  • vue3 基于antd3.2.20封装表格(插槽)
    <!--表格组件--><a-table:dataSource="tableData":columns="columns":pagination="false":scroll="{y:tableHeight,x:1500}":rowKey="'id'">......
  • WEB自动化-框架-关键字封装
    所谓的关键字驱动,本质就是函数封装的过程。⾃动化当中的封装⽬的是:拆分重复的⾏为代码和测试数据,增加可维护性和复⽤性 对于某些用例都需要执行的功能,比如登陆、切换环境、登陆后进入大模块等。像这样的前置功能或者后置功能写到一个用例里面,其他用例就不能使用了。所以需要配......
  • 二分答案,二分搜索,封装
    namespacebinarySearch{ //最后一个小于等于 template<typenameT> T*binarySearchLastSmall(T*l,T*r,intkey){ while(l+1<r){ T*mid=l+(r-l)/2; if(*mid<=key)l=mid; elser=mid; } returnl; } //最后一个小于 template<typenameT>......
  • ubuntu配置http环境 php7.4
    #安装openssh-serverapt-getupdateapt-getinstallopenssh-server#安装vimapt-getinstallvim#修改sshd_config允许root登录vim/etc/ssh/sshd_configPermitRootLoginyes#启动sshservicesshstart安装多个源apt-getinstallsoftware-properties-commonadd-a......
  • php简单MYSQL操作类
    <?php/*简单MYSQL操作类include'./mysqlDb.php';$mysql=null;try{$mysql=newdb('localhost','root','root','test');//SELECT$mysql->select('SELECT*FROMabc');//UPDATE$mys......