>  기사  >  백엔드 개발  >  我的HTTP Client 模拟PHP Class

我的HTTP Client 模拟PHP Class

WBOY
WBOY원래의
2016-05-19 14:05:211130검색

最近因为要通过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 = '';

       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);

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.