首页 > 编程语言 >使用 PHP cURL 实现 HTTP 请求类

使用 PHP cURL 实现 HTTP 请求类

时间:2024-05-24 09:41:23浏览次数:36  
标签:body ch HTTP response header return cURL PHP curl

类结构

创建一个 HttpRequest 类,其中包括初始化 cURL 的方法、不同类型的 HTTP 请求方法,以及一些用于处理响应头和解析响应内容的辅助方法。

初始化 cURL

首先,创建一个私有方法 initCurl,用于初始化 cURL 句柄并设置一些常用的选项。

class HttpRequest
{
    private function initCurl($url, $headers)
    {
        $ch = curl_init($url);
        // 常用选项
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true); // 包含响应头
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        // 绕过HTTPS验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        return $ch;
    }

发送 GET 请求

实现一个 get 方法,发送 GET 请求并返回响应的头部和主体。

    public function get($url, $headers = [])
    {
        $ch = $this->initCurl($url, $headers);
        curl_setopt($ch, CURLOPT_HTTPGET, true);

        $response = curl_exec($ch);

        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new Exception('cURL Error: ' . $error);
        }

        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);

        curl_close($ch);

        return [
            'header' => $header,
            'body' => $body
        ];
    }

发送 POST 请求

接下来是 post 方法,用于发送 POST 请求。可以传递数据和可选的头部信息。

    public function post($url, $data, $headers = [], $cookies = null)
    {
        $ch = $this->initCurl($url, $headers);
        curl_setopt($ch, CURLOPT_POST, true);
        
        if (is_array($data)) {
            $data = http_build_query($data);
        }
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

        $response = curl_exec($ch);

        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new Exception('cURL Error: ' . $error);
        }

        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);
        curl_close($ch);
        return [
            'header' => $header,
            'body' => $body
        ];
    }

发送 PUT 请求

然后是 put 方法,用于发送 PUT 请求。

    public function put($url, $headers = [])
    {
        $ch = $this->initCurl($url, $headers);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        
        $response = curl_exec($ch);
        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new Exception('cURL Error: ' . $error);
        }
        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);
    
        curl_close($ch);
    
        return [
            'header' => $header,
            'body' => $body
        ];
    }

实现一个 parseSetCookieHeader 方法,用于解析响应头中的 Set-Cookie 头。

    public function parseSetCookieHeader($header)
    {
        preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $header, $matches);
        if (empty($matches[1])) {
            return ''; // 没有找到 Set-Cookie 头,返回空字符串
        }
        $cookieStrings = [];
        foreach ($matches[1] as $item) {
            $cookieStrings[] = $item;
        }
        return implode('; ', $cookieStrings);
    }

解析响应内容

最后,我们实现一个 parseResponseFormat 方法,根据响应头中的 Content-Type 解析响应内容。

    public function parseResponseFormat($header, $body)
    {
        if (strpos($header, 'Content-Type: application/json') !== false) {
            return json_decode($body, true);
        } elseif (strpos($header, 'Content-Type: application/xml') !== false || strpos($header, 'Content-Type: text/xml') !== false) {
            $xmlObject = simplexml_load_string($body);
            if ($xmlObject !== false) {
                return json_decode(json_encode($xmlObject));
            } else {
                return [];
            }
        } else {
            return $body;
        }
    }
}
点击查看代码
<?php

class HttpRequest
{
    private function initCurl($url, $headers)
    {
        $ch = curl_init($url);
        // 常用选项
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true); // 包含响应头
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        // 绕过HTTPS验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        return $ch;
    }
    
    public function put($url, $headers = [])
    {
        $ch = $this->initCurl($url, $headers);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        
        // curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $response = curl_exec($ch);
        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new Exception('cURL Error: ' . $error);
        }
        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);
    
        curl_close($ch);
    
        return [
            'header' => $header,
            'body' => $body
        ];
    }
        
    
    

    public function get($url, $headers = [])
    {
        $ch = $this->initCurl($url, $headers);
        curl_setopt($ch, CURLOPT_HTTPGET, true);

        $response = curl_exec($ch);

        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new Exception('cURL Error: ' . $error);
        }

        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);

        curl_close($ch);

        return [
            'header' => $header,
            'body' => $body
        ];
    }

    public function post($url, $data, $headers = [], $cookies = null)
    {
        $ch = $this->initCurl($url, $headers, $cookies);
        curl_setopt($ch, CURLOPT_POST, true);
        
        if(is_array($data)){
            $data = http_build_query($data);
        }
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

        $response = curl_exec($ch);

        if ($response === false) {
            $error = curl_error($ch);
            curl_close($ch);
            throw new Exception('cURL Error: ' . $error);
        }

        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);
        curl_close($ch);
        return [
            'header' => $header,
            'body' => $body
        ];
    }

    public function parseSetCookieHeader($header)
    {
        preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $header, $matches);
        if (empty($matches[1])) {
            return ''; // 没有找到 Set-Cookie 头,返回空字符串
        }
        $cookieStrings = [];
        foreach ($matches[1] as $item) {
            $cookieStrings[] = $item;
        }
        return implode('; ', $cookieStrings);
        
        // preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $header, $matches);
        // $cookies = [];
        // foreach ($matches[1] as $item) {
        //     parse_str($item, $cookie);
        //     $cookies = array_merge($cookies, $cookie);
        // }
        // return $cookies;
    }

    public function parseResponseFormat($header, $body)
    {
        
        if (strpos($header, 'Content-Type: application/json') !== false) {
            return json_decode($body, true);
        } elseif (strpos($header, 'Content-Type: application/xml') !== false || strpos($header, 'Content-Type: text/xml') !== false) {
    
            $xmlObject = simplexml_load_string($body);
            if ($xmlObject !== false) {
    
                return json_decode(json_encode($xmlObject));
            } else {
    
               return [];
            }
        } else {
    
            return $body;
        }
    }
    
}

标签:body,ch,HTTP,response,header,return,cURL,PHP,curl
From: https://www.cnblogs.com/zxingduo/p/18209986

相关文章

  • git之fatal: unable to access ‘https://11.2.7.8:68/mjgn/mj.git/‘: SSL certifica
    MENU前言方法一方法二方法三方法四结束语前言出现这个错误是因为Git在访问仓库时遇到了SSL证书问题,具体是证书的密钥太弱,不符合安全要求。方法一升级或更换SSL证书联系服务器管理员,确保服务器上使用的是强密钥SSL证书。推荐使用至少2048位的密钥。方法二......
  • 网络设置 —— Http 响应头和请求头的设置
     get请求可以使用GetAsync方法      Post请求使用PostAsync,      delete请求使用DeleteAsync      Put请求使用PutAsync      请求的完整写法HttpResponseMessageres=awaitnewHttpClient().SendAsync(reg);str......
  • 【MinIO】SpringBoot引入MinIO依赖遇到的一些问题:okhttp、kotlib-stdlib
    参考官方文档SDK:https://docs.min.io/docs/java-client-quickstart-guide.htmlMinIOJavaSDKisSimpleStorageService(akaS3)clienttoperformbucketandobjectoperationstoanyAmazonS3compatibleobjectstorageservice.MinIO依赖jar包下载地址:CentralReposi......
  • http和https的区别
    HTTP(HyperTextTransferProtocol)和HTTPS(HyperTextTransferProtocolSecure)都是用于在客户端(如浏览器)和服务器之间传输数据的协议。它们的主要区别在于安全性。以下是HTTP和HTTPS的详细区别:数据传输安全性:HTTP:数据以明文形式传输,缺乏加密。如果数据在传输过程中被拦截,攻击......
  • 新版本的禅道在使用 nginx 做 https 反向代理时,无法正常安装、升级以及登录
    是想从docker的12.5.3版本升级到16.0版本,但是按步骤升级完成后,发现会卡在一个“禅道开源版15版本升级”的介绍页面无限循环直接部署全新的系统,也会卡在配置数据库连接的页面无限循环而且在容器的日志中,会有一条ERROR1045(28000):Accessdeniedforuser'root'@'loca......
  • 截取第一个字用php生成一个头像
    在做商城时生成随机一个头像,找了一下发现用首个字符直接生成的类也不错,和用第三方外链的话还是有不同的,第三方虽然图片比较多,但是会有超时问题,所以用首字母生成方式本地搞,代码如下:点击查看代码1、方法调用测试letter_avatar("壹零柒")2、生成图片方法functionletter_avata......
  • PHP做api开发时,签名验证你是怎么设计的
    开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证。我们在设计签名验证的时候,请注意要满足以下几点:可变性:每次的签名必须是不一样的。时效性:每次请求的时效,过期作废等。唯一性:每......
  • websocket和http的区别
    1、websocket1.1介绍WebSocket是一种实时通信协议,它允许客户端和服务器之间进行双向通信,而不需要每次请求都重新建立连接。WebSocket是HTML5中的新功能,它建立在HTTP协议之上,通过握手协议来建立持久化的连接。WebSocket的握手协议比HTTP的握手协议更简单,因为WebSocket......
  • 解决老旧电脑在win7中浏览器访问https网站出现的Let‘sEncrypt证书过期的问题
        原因LetsEncrypt证书未过期,但是其顶级ca根证书“DSTRootCAX3”在2021-09-01过期了,老旧设备上的win系统会被影响到。解决步骤下载三张Letsencrypt的根证书“DSTRootCAX3”的最新版本,包含isrgrootx1.der+isrg-root-x2.der+lets-encrypt-r3.der:https://do......
  • Gin 框架是怎么使用 net http 包的(gin.go)
     Gin框架是基于Go语言的标准库net/http构建的,它使用net/http提供的基础功能来构建自己的高性能Web应用框架。具体来说,Gin使用net/http的以下方面: 1,HandlerFunc:Gin使用net/http的HandlerFunc类型,这是一个可以作为HTTP处理程序的函数类型。Gin自己的路......