侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP封装的HttpClient类用法实例

php  /  管理员 发布于 7年前   186

本文实例讲述了PHP封装的HttpClient类。分享给大家供大家参考。具体分析如下:

这是一段php封装的HttpClient类,可实现GET POST Cookie Session等简单的功能。原来做过,这两天重新修改了一下。

name = trim(substr($s, 0, $i1));       $this->value = trim(substr($s, $i1 +1, $i2 - $i1 -1));     }   }   // 获取Cookie键值对   function getKeyValue() {     return "$this->name=$this->value";   } } // 会话上下文 class SinHttpContext {   public $cookies; // 会话Cookies   public $referer; // 前一个页面地址   function __construct() {     $this->cookies = array ();     $this->refrer = "";   }   // 设置Cookie   function cookie($key, $val) {     $ck = new SinCookie();     $ck->name = $key;     $ck->value = $val;     $this->addCookie($ck);   }   // 添加Cookie   function addCookie($ck) {     $this->cookies[$ck->name] = $ck;   }   // 获取Cookies字串,请求时用到   function cookiesString() {     $res = '';     foreach ($this->cookies as $ck) {       $res .= $ck->getKeyValue() . ';';     }     return $res;   } } // Http请求对象 class SinHttpRequest {   public $url; // 请求地址   public $method = 'GET'; // 请求方法   public $host; // 主机   public $path; // 路径   public $scheme; // 协议,http   public $port; // 端口   public $header; // 请求头   public $body; // 请求正文   // 设置头   function setHeader($k, $v) {     if (!isset ($this->header)) {       $this->header = array ();     }     $this->header[$k] = $v;   }   // 获取请求字符串   // 包含头和请求正文   // 获取之后直接写socket就行   function reqString() {     $matches = parse_url($this->url);     !isset ($matches['host']) && $matches['host'] = '';     !isset ($matches['path']) && $matches['path'] = '';     !isset ($matches['query']) && $matches['query'] = '';     !isset ($matches['port']) && $matches['port'] = '';     $host = $matches['host'];     $path = $matches['path'] ? $matches['path'] . ($matches['query'] ? '?' . $matches['query'] : '') : '/';     $port = !empty ($matches['port']) ? $matches['port'] : 80;     $scheme = $matches['scheme'] ? $matches['scheme'] : 'http';     $this->host = $host;     $this->path = $path;     $this->scheme = $scheme;     $this->port = $port;     $method = strtoupper($this->method);     $res = "$method $path HTTP/1.1\r\n";     $res .= "Host: $host\r\n";     if ($this->header) {       reset($this->header);       while (list ($k, $v) = each($this->header)) {         if (isset ($v) && strlen($v) > 0)           $res .= "$k: $v\r\n";       }     }     $res .= "\r\n";     if ($this->body) {       $res .= $this->body;       $res .= "\r\n\r\n";     }     return $res;   } } // Http响应 class SinHttpResponse {   public $scheme; // 协议   public $stasus; // 状态,成功的时候是ok   public $code; // 状态码,成功的时候是200   public $header; // 响应头   public $body; // 响应正文   function __construct() {     $this->header = array ();     $this->body = null;   }   function setHeader($key, $val) {     $this->header[$key] = $val;   } } // HttpClient class SinHttpClient {   public $keepcontext = true; // 是否维持会话   public $context; // 上下文   public $request; // 请求   public $response; // 响应   public $debug = false;  // 是否在Debug模式,  //为true的时候会打印出请求内容和相同的头部   function __construct() {     $this->request = new SinHttpRequest();     $this->response = new SinHttpResponse();     $this->context = new SinHttpContext();     $this->timeout = 15; // 默认的超时为15s   }   // 清除上一次的请求内容   function clearRequest() {     $this->request->body = '';     $this->request->setHeader('Content-Length', false);     $this->request->setHeader('Content-Type', false);   }   // post方法   // data为请求的数据   // 为键值对的时候模拟表单提交   // 其他时候为数据提交,提交的形式为xml   // 如有其他需求,请自行扩展   function post($url, $data = false) {     $this->clearRequest();     if ($data) {       if (is_array($data)) {         $con = http_build_query($data);         $this->request->setHeader('Content-Type', 'application/x-www-form-urlencoded');       } else {         $con = $data;         $this->request->setHeader('Content-Type', 'text/xml; ');       }       $this->request->body = $con;       $this->request->method = "POST";       $this->request->setHeader('Content-Length', strlen($con));     }     $this->startRequest($url);   }   // get方法   function get($url) {     $this->clearRequest();     $this->request->method = "GET";     $this->startRequest($url);   }   // 该方法为内部调用方法,不用直接调用   function startRequest($url) {     $this->request->url = $url;     if ($this->keepcontext) {       // 如果保存上下文的话设置相关信息       $this->request->setHeader('Referer', $this->context->refrer);       $cks = $this->context->cookiesString();       if (strlen($cks) > 0)         $this->request->setHeader('Cookie', $cks);     }     // 获取请求内容     $reqstring = $this->request->reqString();     if ($this->debug)       echo "Request:\n$reqstring\n";     try {       $fp = fsockopen($this->request->host, $this->request->port, $errno, $errstr, $this->timeout);     } catch (Exception $ex) {       echo $ex->getMessage();       exit (0);     }     if ($fp) {       stream_set_blocking($fp, true);       stream_set_timeout($fp, $this->timeout);       // 写数据       fwrite($fp, $reqstring);       $status = stream_get_meta_data($fp);       if (!$status['timed_out']) { //未超时         // 下面的循环用来读取响应头部         while (!feof($fp)) {           $h = fgets($fp);           if ($this->debug) echo $h;           if ($h && ($h == "\r\n" || $h == "\n")) break;           $pos = strpos($h, ':');           if ($pos) { $k = strtolower(trim(substr($h, 0, $pos))); $v = trim(substr($h, $pos +1)); if ($k == 'set-cookie') {   // 更新Cookie   if ($this->keepcontext) {     $this->context->addCookie(new SinCookie($v));   } } else {   // 添加到头里面去   $this->response->setHeader($k, $v); }           } else { // 第一行数据 // 解析响应状态 $preg = '/^(\S*) (\S*) (.*)$/'; preg_match_all($preg, $h, $arr); isset ($arr[1][0]) & $this->response->scheme = trim($arr[1][0]); isset ($arr[2][0]) & $this->response->stasus = trim($arr[2][0]); isset ($arr[3][0]) & $this->response->code = trim($arr[3][0]);           }         }         // 获取响应正文长度         $len = (int) $this->response->header['content-length'];         $res = '';         // 下面的循环读取正文         while (!feof($fp) && $len > 0) {           $c = fread($fp, $len);           $res .= $c;           $len -= strlen($c);         }         $this->response->body = $res;       }       // 关闭Socket       fclose($fp);       // 把返回保存到上下文维持中       $this->context->refrer = $url;     }   } } // demo // now let begin test it $client = new SinHttpClient(); // create a client $client->get('http://www.baidu.com/');  // get echo $client->response->body; // echo ?>

希望本文所述对大家的php程序设计有所帮助。

您可能感兴趣的文章:

  • httpclient模拟post请求json封装表单数据的实现方法
  • Android中HttpURLConnection与HttpClient的使用与封装
  • 完成OSS.Http底层HttpClient重构封装 支持标准库


  • 上一条:
    php使用CURL不依赖COOKIEJAR获取COOKIE的方法
    下一条:
    PHP处理postfix邮件内容的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客