热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我的HTTPClient模拟PHPClass

最近因为要通过php调用REST接口,简单的写了一个模拟HTTPClient的PHPClass.相当于模拟浏览器操作.这是一个初始版本.等以后有时间了在完善下.如果有什么意见或者好的想法,欢迎指教.<?php* 
最近因为要通过php调用REST接口,简单的写了一个模拟HTTPClient的PHP Class.相当于模拟浏览器操作.这是一个初始版本.等以后有时间了在完善下.如果有什么意见或者好的想法,欢迎指教.

/*
===========================================================
  HTTP.php  Zhu Weiwei
  Copyright © 2006-2008
  http://www.cncmm.com China. All Rights Reserved.
===========================================================
*/

class HTTP{
  PRivate $m_httpVersion = "HTTP/1.0";
  private $m_method    = "GET";
  private $m_enctype   = "application/x-www-form-urlencoded";
  private $m_scheme    = "http";
  private $m_host     = "127.0.0.1";
  private $m_port     = 80;
  private $m_path     = "/";
  private $m_query    = "";
  private $m_fragment   = "";
  private $m_user     = "";
  private $m_pass     = "";
  private $m_uri     = "/";

  private $m_referer   = "";
  private $m_mimeBoundary = "";
  private $m_sockTimeout = 10;
  private $m_readTimeout = 10;
  private $m_timeout   = false;
 
  private $m_sock     = "";
  private $m_error    = "";
  private $CRLF      = "\r\n";

  private $m_arrParam   = Array();
  private $m_arrFile   = Array();
  private $m_arrCOOKIE  = Array();

  private $m_request   = "";
  private $m_requestHead = "";
  private $m_requestBody = "";

  private $m_response   = "";
  private $m_respOnseHead= Array();
  private $m_respOnseBody= "";

  private $m_maxLineLength= 1024;

  function __construct() {

  }

  function getResponseHead() {
    return $this->m_responseHead;
  }

  function getResponseBody() {
    return $this->m_responseBody;
  }

  function getResponse() {
    return $this->m_response;
  }

  function getRequestHead() {
    return $this->m_requestHead;
  }

  function getRequestBody() {
    return $this->m_requestBody;
  }

  function getRequest() {
    return $this->m_request;
  }

  function getError() {
    return $this->m_error;
  }

  function setMethod($m) {
    $this->m_method = (strtoupper($m=='POST'))?('POST'):('GET');
  }

  function setEnctype($e) {
    $this->m_enctype = (strtolower($e)=='application/x-www-form-urlencoded')?
              ('application/x-www-form-urlencoded'):('multipart/form-data');
  }

  function setURL($url) {
    $rs = parse_url($url);
    $this->m_scheme  = empty($rs['scheme']) ?('http')   :($rs['scheme']);
    $this->m_host   = empty($rs['host'])  ?('localhost'):($rs['host']);
    $this->m_port   = empty($rs['port'])  ?('80')    :($rs['port']);
    $this->m_user   = empty($rs['user'])  ?('')     :($rs['user']);
    $this->m_pass   = empty($rs['pass'])  ?('')     :($rs['pass']);
    $this->m_path   = empty($rs['path'])  ?('/')    :($rs['path']);
    $this->m_query  = empty($rs['query'])  ?('')     :($rs['query']);
    $this->m_fragment = empty($rs['fragment'])?('')     :($rs['fragment']);
   
    $this->m_uri = $this->m_path;
    if(!empty($this->m_query)){
      $this->m_uri .= '?'.$this->m_query;
    }
    if(!empty($this->m_fragment)){
      $this->m_uri .= '#'.$this->m_fragment;
    }
  }


  function addParameter($key,$val) {
    if(!empty($key)){
      $this->m_arrParam[$key] = $val;
    }
  }

  function addFile($key,$file) {
    if(!empty($key) && file_exists($file)){
      $this->m_arrFile[$key] = $file;
    }
  }

  function addCOOKIE($key,$val) {
    if(!empty($key)){
      $this->m_arrCOOKIE[$key] = $val;
    }
  }

  function connect() {
    $this->m_sock = fsockopen($this->m_host,
                 $this->m_port,
                 $errno,
                 $errstr,
                 $this->m_sockTimeout);

  if($this->m_sock){
      return true;
    }else{
      switch($errno){
        case -3: $this->m_error="socket creation failed (-3)";     break;
        case -4: $this->m_error="dns lookup failure (-4)";       break;
        case -5: $this->m_error="connection refused or timed out (-5)"; break;
        default: $this->m_error="connection failed (".$errno.")";    break;
      }
      return false;
    }
  }

  function disconnect(){
    return(fclose($this->m_sock));
  }

http://www.devdao.com/
  function sendRequest() {
    if($this->connect()){
      $this->buildRequest();

    socket_set_timeout($this->m_sock, $this->m_readTimeout);
      fwrite($this->m_sock, $this->m_request, strlen($this->m_request));

    /*
        Get And Parse HTTP Header
      */

    while( !feof($this->m_sock) )
      {
        if( $this->m_readTimeout > 0 && $this->checkResponseTimeOut() ){
          return false;
        }
        $line = fgets($this->m_sock, $this->m_maxLineLength);
        if($line == $this->CRLF )
          break;

      $this->m_responseHead['Content'] .= $line;
        if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$line, $status)){
          $this->m_responseHead['Status'] = $status[1];
        }else{
          list($key,$val) = explode(': ',$line,2);
          $this->m_responseHead[$key] = $val;
        }
      }

    /*
        Get HTTP Body
      */
      while(!feof($this->m_sock) ) {
        if( $this->m_readTimeout > 0 && $this->checkResponseTimeOut() ){
          return false;
        }
        $this->m_responseBody .= fgets($this->m_sock, $this->m_maxLineLength);
      }   

    $this->m_respOnse= $this->m_responseHead['Content'].$this->m_responseBody;
      $this->disconnect();
      return true;
    }else{
      return false;
    }
  }

  function checkResponseTimeOut()
  {
    if ($this->m_readTimeout > 0) {
      $fp_status = socket_get_status($this->m_sock);
      if ($fp_status["timed_out"]) {
        $this->m_error="read response timeout!";
        return true;
      }
    }
    return false;
  }


  function buildRequest() {
    switch( $this->m_method ){
      case "POST":
        $body = $this->buildRequestBody();
        $head = $this->buildRequestHead();

      $this->m_request = $head.$this->CRLF.$this->CRLF.$body;
        break;

    case "GET":
        $head = $this->buildRequestHead();

      $this->m_request = $head.$this->CRLF.$this->CRLF;
        break;
    }
    return $this->m_request;
  }


  function buildRequestHead() {
    $header = Array();
    switch( $this->m_method ){
      case "POST":
        $header[] ="POST $this->m_uri $this->m_httpVersion";
        $header[] = "Content-Length: ".strlen($this->m_requestBody);
        switch ($this->m_enctype) {
          case "application/x-www-form-urlencoded":
            $header[] ="Content-Type: application/x-www-form-urlencoded";
            //$header[] ="Content-Type: application/xml; charset=UTF-8";
            break;
          case "multipart/form-data":
            $header[] ="Content-Type: multipart/form-data; boundary=$this->m_mimeBoundary";  
            break;
        }
        break;
      case "GET":
        $header[] ="GET $this->m_uri $this->m_httpVersion";
        break;
    }

  $header[] = "Cache-Control: no-cache";
    $header[] = "Pragma: no-cache";
    $header[] = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11";
    $header[] = "Accept: */*";
    #$header[] = "Accept-Language: zh-cn";
    #$header[] = "Accept-Encoding: gzip,deflate";
    #$header[] = "Accept-Charset: utf-8";
    $header[] = "Connection: Keep-Alive";
    $header[] = "Keep-Alive: 300";

  //$header[] = "Connection: Close";
    //$header[] = "Referer: $this->m_referer";
    //$header[] = "COOKIE: ".join(';',$this->m_arrCOOKIE);

  if( intval($this->m_port) == 80 ){
      $header[] = "Host: $this->m_host";
    }else{
      $header[] = "Host: $this->m_host:$this->m_port";
    }

  if(!empty($this->m_user) || !empty($this->m_pass)){ 
      $header[] = "Authorization: Basic ".base64_encode($this->m_user.":".$this->m_pass);
    }

  $this->m_requestHead = join($this->CRLF, $header);
    return $this->m_requestHead;
  }


  function buildRequestBody() {
    $body = Array();
    switch ($this->m_enctype) {
      case "application/x-www-form-urlencoded":
        foreach( $this->m_arrParam as $key=>$val) {
          $body[] = urlencode($key)."=".urlencode($val);
        }
        $this->m_requestBody = join("&",$body);
        //$this->m_requestBody = json_encode($this->m_arrParam); //For Rest
        break;

    case "multipart/form-data":
        $this->m_mimeBoundary = '<'.base64_encode(uniqid(microtime(),true)).'=>';

      foreach( $this->m_arrParam as $key=>$val) {
          $body[] = "--".$this->m_mimeBoundary;
          $body[] = "Content-Disposition: form-data; name=\"$key\"".$this->CRLF;
          $body[] = $val;
        }

      foreach( $this->m_arrFile as $key=>$filename) {
          $body[] = "--".$this->m_mimeBoundary;
          $body[] = "Content-Disposition: form-data; name=\"$key\"; filename=\"$filename\"";
          $body[] = "Content-Type: application/octet-stream";
          $body[] = "Content-Transfer-Encoding: Binary".$this->CRLF;
          $body[] = file_get_contents($filename);
        }
        $body[] = "--".$this->m_mimeBoundary."--".$this->CRLF;
        $this->m_requestBody = join($this->CRLF,$body);
        break;
    }
    return $this->m_requestBody;
  }
};
example.php

require_once("http.php");
$oHTTP = new HTTP();
$oHTTP->setURL("http://www.cncmm.com/");
$oHTTP->setMethod("POST");
$oHTTP->addParameter("param","value");
$oHTTP->addFile("filedata","/tmp/tmpFile");
if( !$oHTTP->sendRequest() ){
  print($oHTTP->getError());
  exit();
}
$request = $oHTTP->getRequest();
$respOnse= $oHTTP->getResponse();
print($response);


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
没有水的鱼0713
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有