当前位置:首页 > PHP教程 > php应用 > 列表

PHP实现支持GET,POST,Multipart/form-data的HTTP请求类

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-14 11:40:06 浏览: 评论:0 

这篇文章主要介绍了PHP实现支持GET,POST,Multipart/form-data的HTTP请求类,包括了连接与处理方式及相关的技巧,需要的朋友可以参考下

本文实例讲述了PHP实现支持GET,POST,Multipart/form-data的HTTP请求类及其应用,分享给大家供大家参考。具体如下:

HttpRequest.class.php类文件如下:

  1. <?php  
  2. /** HttpRequest class, HTTP请求类,支持GET,POST,Multipart/form-data  
  3. *  Date:  2013-09-25  
  4. *  Author: fdipzone  
  5. *  Ver:  1.0  
  6.  
  7. *  Func:  
  8. *  public setConfig   设置连接参数  
  9. *  public setFormdata  设置表单数据  
  10. *  public setFiledata  设置文件数据  
  11. *  public send     发送数据  
  12. *  private connect    创建连接  
  13. *  private disconnect  断开连接  
  14. *  private sendGet    get 方式,处理发送的数据,不会处理文件数据  
  15. *  private sendPost   post 方式,处理发送的数据  
  16. *  private sendMultipart multipart 方式,处理发送的数据,发送文件推荐使用此方式  
  17. */ 
  18.    
  19. class HttpRequest{ // class start  
  20.    
  21.   private $_ip = '';  
  22.   private $_host = '';  
  23.   private $_url = '';  
  24.   private $_port = '';  
  25.   private $_errno = '';  
  26.   private $_errstr = '';  
  27.   private $_timeout = 15;  
  28.   private $_fp = null;  
  29.      
  30.   private $_formdata = array();  
  31.   private $_filedata = array();  
  32.    
  33.    
  34.   // 设置连接参数  
  35.   public function setConfig($config){  
  36.     $this->_ip = isset($config['ip'])? $config['ip'] : '';  
  37.     $this->_host = isset($config['host'])? $config['host'] : '';  
  38.     $this->_url = isset($config['url'])? $config['url'] : '';  
  39.     $this->_port = isset($config['port'])? $config['port'] : '';  
  40.     $this->_errno = isset($config['errno'])? $config['errno'] : '';  
  41.     $this->_errstr = isset($config['errstr'])? $config['errstr'] : '';  
  42.     $this->_timeout = isset($confg['timeout'])? $confg['timeout'] : 15;  
  43.    
  44.     // 如没有设置ip,则用host代替  
  45.     if($this->_ip==''){  
  46.       $this->_ip = $this->_host;  
  47.     }  
  48.   }  
  49.    
  50.   // 设置表单数据  
  51.   public function setFormData($formdata=array()){  
  52.     $this->_formdata = $formdata;  
  53.   }  
  54.    
  55.   // 设置文件数据  
  56.   public function setFileData($filedata=array()){  
  57.     $this->_filedata = $filedata;  
  58.   }  
  59.    
  60.   // 发送数据  
  61.   public function send($type='get'){  
  62.    
  63.     $type = strtolower($type);  
  64.    
  65.     // 检查发送类型  
  66.     if(!in_array($typearray('get','post','multipart'))){  
  67.       return false;  
  68.     }  
  69.    
  70.     // 检查连接  
  71.     if($this->connect()){  
  72.    
  73.       switch($type){  
  74.         case 'get':  
  75.           $out = $this->sendGet();  
  76.           break;  
  77.    
  78.         case 'post':  
  79.           $out = $this->sendPost();  
  80.           break;  
  81.    
  82.         case 'multipart':  
  83.           $out = $this->sendMultipart();  
  84.           break;  
  85.       }  
  86.    
  87.       // 空数据  
  88.       if(!$out){  
  89.         return false;  
  90.       }  
  91.    
  92.       // 发送数据  
  93.       fputs($this->_fp, $out);  
  94.    
  95.       // 读取返回数据  
  96.       $response = '';  
  97.    
  98.       while($row = fread($this->_fp, 4096)){  
  99.         $response .= $row;  
  100.       }  
  101.    
  102.       // 断开连接  
  103.       $this->disconnect();  
  104.    
  105.       $pos = strpos($response"\r\n\r\n");  
  106.       $response = substr($response$pos+4);  
  107.    
  108.       return $response;  
  109.    
  110.     }else{  
  111.       return false;  
  112.     }  
  113.   }  
  114.    
  115.   // 创建连接  
  116.   private function connect(){  
  117.     $this->_fp = fsockopen($this->_ip, $this->_port, $this->_errno, $this->_errstr, $this->_timeout);  
  118.     if(!$this->_fp){  
  119.       return false;  
  120.     }  
  121.     return true;  
  122.   }  
  123.    
  124.   // 断开连接  
  125.   private function disconnect(){  
  126.     if($this->_fp!=null){  
  127.       fclose($this->_fp);  
  128.       $this->_fp = null;  
  129.     }  
  130.   }  
  131.    
  132.   // get 方式,处理发送的数据,不会处理文件数据  
  133.   private function sendGet(){  
  134.    
  135.     // 检查是否空数据  
  136.     if(!$this->_formdata){  
  137.       return false;  
  138.     }  
  139.    
  140.     // 处理url  
  141.     $url = $this->_url.'?'.http_build_query($this->_formdata);  
  142.        
  143.     $out = "GET ".$url." http/1.1\r\n";  
  144.     $out .= "host: ".$this->_host."\r\n";  
  145.     $out .= "connection: close\r\n\r\n";  
  146.    
  147.     return $out;  
  148.   }  
  149.    
  150.   // post 方式,处理发送的数据  
  151.   private function sendPost(){  
  152.    
  153.     // 检查是否空数据  
  154.     if(!$this->_formdata && !$this->_filedata){  
  155.       return false;  
  156.     }  
  157.    
  158.     // form data  
  159.     $data = $this->_formdata? $this->_formdata : array();  
  160.    
  161.     // file data  
  162.     if($this->_filedata){  
  163.       foreach($this->_filedata as $filedata){  
  164.         if(file_exists($filedata['path'])){  
  165.           $data[$filedata['name']] = file_get_contents($filedata['path']);  
  166.         }  
  167.       }  
  168.     }  
  169.    
  170.     if(!$data){  
  171.       return false;  
  172.     }  
  173.    
  174.     $data = http_build_query($data);  
  175.    
  176.     $out = "POST ".$this->_url." http/1.1\r\n";  
  177.     $out .= "host: ".$this->_host."\r\n";  
  178.     $out .= "content-type: application/x-www-form-urlencoded\r\n";  
  179.     $out .= "content-length: ".strlen($data)."\r\n";  
  180.     $out .= "connection: close\r\n\r\n";  
  181.     $out .= $data;  
  182.    
  183.     return $out;  
  184.   }  
  185.    
  186.   // multipart 方式,处理发送的数据,发送文件推荐使用此方式  
  187.   private function sendMultipart(){  
  188.    
  189.     // 检查是否空数据  
  190.     if(!$this->_formdata && !$this->_filedata){  
  191.       return false;  
  192.     }  
  193.    
  194.     // 设置分割标识  
  195.     srand((double)microtime()*1000000);  
  196.     $boundary = '---------------------------'.substr(md5(rand(0,32000)),0,10);  
  197.    
  198.     $data = '--'.$boundary."\r\n";  
  199.    
  200.     // form data  
  201.     $formdata = '';  
  202.    
  203.     foreach($this->_formdata as $key=>$val){  
  204.       $formdata .= "content-disposition: form-data; name=\"".$key."\"\r\n";  
  205.       $formdata .= "content-type: text/plain\r\n\r\n";  
  206.       if(is_array($val)){  
  207.         $formdata .= json_encode($val)."\r\n"// 数组使用json encode后方便处理  
  208.       }else{  
  209.         $formdata .= rawurlencode($val)."\r\n";  
  210.       }  
  211.       $formdata .= '--'.$boundary."\r\n";  
  212.     }  
  213.    
  214.     // file data  
  215.     $filedata = '';  
  216.    
  217.     foreach($this->_filedata as $val){  
  218.       if(file_exists($val['path'])){  
  219.         $filedata .= "content-disposition: form-data; name=\"".$val['name']."\"; filename=\"".$val['filename']."\"\r\n";  
  220.         $filedata .= "content-type: ".mime_content_type($val['path'])."\r\n\r\n";  
  221.         $filedata .= implode('', file($val['path']))."\r\n";  
  222.         $filedata .= '--'.$boundary."\r\n";  
  223.       }  
  224.     }  
  225.    
  226.     if(!$formdata && !$filedata){  
  227.       return false;  
  228.     }  
  229.    
  230.     $data .= $formdata.$filedata."--\r\n\r\n";  
  231.    
  232.     $out = "POST ".$this->_url." http/1.1\r\n";  
  233.     $out .= "host: ".$this->_host."\r\n";  
  234.     $out .= "content-type: multipart/form-data; boundary=".$boundary."\r\n";  
  235.     $out .= "content-length: ".strlen($data)."\r\n";  
  236.     $out .= "connection: close\r\n\r\n";  
  237.     $out .= $data;  
  238.    
  239.     return $out;  
  240.   }  
  241. // class end  
  242.    
  243. ?> 

demo示例程序如下:

  1. <?php  
  2. require('HttpRequest.class.php');  
  3.    
  4. $config = array(  
  5.       'ip' => 'demo.fdipzone.com'// 如空则用host代替  
  6.       'host' => 'demo.fdipzone.com',  
  7.       'port' => 80,  
  8.       'errno' => '',  
  9.       'errstr' => '',  
  10.       'timeout' => 30,  
  11.       'url' => '/getapi.php',  
  12.       //'url' => '/postapi.php',  
  13.       //'url' => '/multipart.php'  
  14. );  
  15.    
  16. $formdata = array(  
  17.   'name' => 'fdipzone',  
  18.   'gender' => 'man' 
  19. );  
  20.    
  21. $filedata = array(  
  22.   array(  
  23.     'name' => 'photo',  
  24.     'filename' => 'photo.jpg',  
  25.     'path' => 'photo.jpg' 
  26.   )  
  27. );  
  28.  //www.phpfensi.com 
  29. $obj = new HttpRequest();  
  30. $obj->setConfig($config);  
  31. $obj->setFormData($formdata);  
  32. $obj->setFileData($filedata);  
  33. $result = $obj->send('get');  
  34. //$result = $obj->send('post');  
  35. //$result = $obj->send('multipart');  
  36.    
  37. echo '<pre>';  
  38. print_r($result);  
  39. echo '</pre>';  
  40.    
  41. ?>  

Tags: GET POST HTTP请求类

分享到: