加入收藏 | 设为首页 | 会员中心 | 我要投稿 咸宁站长网 (https://www.0715zz.cn/)- 文字识别、智能机器人、媒体智能、低代码、运维!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP封装的HttpClient类用法实例

发布时间:2022-06-21 09:40:39 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP封装的HttpClient类,可实现简单的GET、POST、Cookie、Session等功能,需要的朋友可以参考下。 本文实例讲述了PHP封装的HttpClient类,分享给大家供大家参考,具体分析如下: 这是一段php封装的HttpClient类,可实现GET POST Cookie Sess
  这篇文章主要介绍了PHP封装的HttpClient类,可实现简单的GET、POST、Cookie、Session等功能,需要的朋友可以参考下。
 
  本文实例讲述了PHP封装的HttpClient类,分享给大家供大家参考,具体分析如下:
 
  这是一段php封装的HttpClient类,可实现GET POST Cookie Session等简单的功能,原来做过,这两天重新修改了一下。
 
  <?php  
  /*  
   * Filename: httpclient.php  
   * Created on 2012-12-21  
   * Created by RobinTang  
   * To change the template for this generated file go to  
   * Window - Preferences - PHPeclipse - PHP - Code Templates  
   */
  class SinCookie {  
    public $name; // Cookie名称  
    public $value; // Cookie值  
    // 下面三个属性现在未实现  
    public $expires; // 过期时间  
    public $path; // 路径  
    public $domain; // 域  
    // 从Cookie字符串创建一个Cookie对象  
    function __construct($s = false) {  
      if ($s) {  
        $i1 = strpos($s, '=');  
        $i2 = strpos($s, ';');  
        $this->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 = !emptyempty ($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.1rn";  
      $res .= "Host: $hostrn";  
      if ($this->header) {  
        reset($this->header);  
        while (list ($k, $v) = each($this->header)) {  
          if (isset ($v) && strlen($v) > 0)  
            $res .= "$k: $vrn";  
        }  
      }  
      $res .= "rn";  
      if ($this->body) {  
        $res .= $this->body;  
        $res .= "rnrn";  
      }  
      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; charset=utf-8');  
        }  
        $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$reqstringn";  
      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 == "rn" || $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  
  ?>

(编辑:咸宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读