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


Posted in PHP onSeptember 24, 2014

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

HttpRequest.class.php类文件如下:

<?php 
/** HttpRequest class, HTTP请求类,支持GET,POST,Multipart/form-data 
*  Date:  2013-09-25 
*  Author: fdipzone 
*  Ver:  1.0 
* 
*  Func: 
*  public setConfig   设置连接参数 
*  public setFormdata  设置表单数据 
*  public setFiledata  设置文件数据 
*  public send     发送数据 
*  private connect    创建连接 
*  private disconnect  断开连接 
*  private sendGet    get 方式,处理发送的数据,不会处理文件数据 
*  private sendPost   post 方式,处理发送的数据 
*  private sendMultipart multipart 方式,处理发送的数据,发送文件推荐使用此方式 
*/ 
 
class HttpRequest{ // class start 
 
  private $_ip = ''; 
  private $_host = ''; 
  private $_url = ''; 
  private $_port = ''; 
  private $_errno = ''; 
  private $_errstr = ''; 
  private $_timeout = 15; 
  private $_fp = null; 
   
  private $_formdata = array(); 
  private $_filedata = array(); 
 
 
  // 设置连接参数 
  public function setConfig($config){ 
    $this->_ip = isset($config['ip'])? $config['ip'] : ''; 
    $this->_host = isset($config['host'])? $config['host'] : ''; 
    $this->_url = isset($config['url'])? $config['url'] : ''; 
    $this->_port = isset($config['port'])? $config['port'] : ''; 
    $this->_errno = isset($config['errno'])? $config['errno'] : ''; 
    $this->_errstr = isset($config['errstr'])? $config['errstr'] : ''; 
    $this->_timeout = isset($confg['timeout'])? $confg['timeout'] : 15; 
 
    // 如没有设置ip,则用host代替 
    if($this->_ip==''){ 
      $this->_ip = $this->_host; 
    } 
  } 
 
  // 设置表单数据 
  public function setFormData($formdata=array()){ 
    $this->_formdata = $formdata; 
  } 
 
  // 设置文件数据 
  public function setFileData($filedata=array()){ 
    $this->_filedata = $filedata; 
  } 
 
  // 发送数据 
  public function send($type='get'){ 
 
    $type = strtolower($type); 
 
    // 检查发送类型 
    if(!in_array($type, array('get','post','multipart'))){ 
      return false; 
    } 
 
    // 检查连接 
    if($this->connect()){ 
 
      switch($type){ 
        case 'get': 
          $out = $this->sendGet(); 
          break; 
 
        case 'post': 
          $out = $this->sendPost(); 
          break; 
 
        case 'multipart': 
          $out = $this->sendMultipart(); 
          break; 
      } 
 
      // 空数据 
      if(!$out){ 
        return false; 
      } 
 
      // 发送数据 
      fputs($this->_fp, $out); 
 
      // 读取返回数据 
      $response = ''; 
 
      while($row = fread($this->_fp, 4096)){ 
        $response .= $row; 
      } 
 
      // 断开连接 
      $this->disconnect(); 
 
      $pos = strpos($response, "\r\n\r\n"); 
      $response = substr($response, $pos+4); 
 
      return $response; 
 
    }else{ 
      return false; 
    } 
  } 
 
  // 创建连接 
  private function connect(){ 
    $this->_fp = fsockopen($this->_ip, $this->_port, $this->_errno, $this->_errstr, $this->_timeout); 
    if(!$this->_fp){ 
      return false; 
    } 
    return true; 
  } 
 
  // 断开连接 
  private function disconnect(){ 
    if($this->_fp!=null){ 
      fclose($this->_fp); 
      $this->_fp = null; 
    } 
  } 
 
  // get 方式,处理发送的数据,不会处理文件数据 
  private function sendGet(){ 
 
    // 检查是否空数据 
    if(!$this->_formdata){ 
      return false; 
    } 
 
    // 处理url 
    $url = $this->_url.'?'.http_build_query($this->_formdata); 
     
    $out = "GET ".$url." http/1.1\r\n"; 
    $out .= "host: ".$this->_host."\r\n"; 
    $out .= "connection: close\r\n\r\n"; 
 
    return $out; 
  } 
 
  // post 方式,处理发送的数据 
  private function sendPost(){ 
 
    // 检查是否空数据 
    if(!$this->_formdata && !$this->_filedata){ 
      return false; 
    } 
 
    // form data 
    $data = $this->_formdata? $this->_formdata : array(); 
 
    // file data 
    if($this->_filedata){ 
      foreach($this->_filedata as $filedata){ 
        if(file_exists($filedata['path'])){ 
          $data[$filedata['name']] = file_get_contents($filedata['path']); 
        } 
      } 
    } 
 
    if(!$data){ 
      return false; 
    } 
 
    $data = http_build_query($data); 
 
    $out = "POST ".$this->_url." http/1.1\r\n"; 
    $out .= "host: ".$this->_host."\r\n"; 
    $out .= "content-type: application/x-www-form-urlencoded\r\n"; 
    $out .= "content-length: ".strlen($data)."\r\n"; 
    $out .= "connection: close\r\n\r\n"; 
    $out .= $data; 
 
    return $out; 
  } 
 
  // multipart 方式,处理发送的数据,发送文件推荐使用此方式 
  private function sendMultipart(){ 
 
    // 检查是否空数据 
    if(!$this->_formdata && !$this->_filedata){ 
      return false; 
    } 
 
    // 设置分割标识 
    srand((double)microtime()*1000000); 
    $boundary = '---------------------------'.substr(md5(rand(0,32000)),0,10); 
 
    $data = '--'.$boundary."\r\n"; 
 
    // form data 
    $formdata = ''; 
 
    foreach($this->_formdata as $key=>$val){ 
      $formdata .= "content-disposition: form-data; name=\"".$key."\"\r\n"; 
      $formdata .= "content-type: text/plain\r\n\r\n"; 
      if(is_array($val)){ 
        $formdata .= json_encode($val)."\r\n"; // 数组使用json encode后方便处理 
      }else{ 
        $formdata .= rawurlencode($val)."\r\n"; 
      } 
      $formdata .= '--'.$boundary."\r\n"; 
    } 
 
    // file data 
    $filedata = ''; 
 
    foreach($this->_filedata as $val){ 
      if(file_exists($val['path'])){ 
        $filedata .= "content-disposition: form-data; name=\"".$val['name']."\"; filename=\"".$val['filename']."\"\r\n"; 
        $filedata .= "content-type: ".mime_content_type($val['path'])."\r\n\r\n"; 
        $filedata .= implode('', file($val['path']))."\r\n"; 
        $filedata .= '--'.$boundary."\r\n"; 
      } 
    } 
 
    if(!$formdata && !$filedata){ 
      return false; 
    } 
 
    $data .= $formdata.$filedata."--\r\n\r\n"; 
 
    $out = "POST ".$this->_url." http/1.1\r\n"; 
    $out .= "host: ".$this->_host."\r\n"; 
    $out .= "content-type: multipart/form-data; boundary=".$boundary."\r\n"; 
    $out .= "content-length: ".strlen($data)."\r\n"; 
    $out .= "connection: close\r\n\r\n"; 
    $out .= $data; 
 
    return $out; 
  } 
} // class end 
 
?>

demo示例程序如下:

<?php 
require('HttpRequest.class.php'); 
 
$config = array( 
      'ip' => 'demo.fdipzone.com', // 如空则用host代替 
      'host' => 'demo.fdipzone.com', 
      'port' => 80, 
      'errno' => '', 
      'errstr' => '', 
      'timeout' => 30, 
      'url' => '/getapi.php', 
      //'url' => '/postapi.php', 
      //'url' => '/multipart.php' 
); 
 
$formdata = array( 
  'name' => 'fdipzone', 
  'gender' => 'man' 
); 
 
$filedata = array( 
  array( 
    'name' => 'photo', 
    'filename' => 'photo.jpg', 
    'path' => 'photo.jpg' 
  ) 
); 
 
$obj = new HttpRequest(); 
$obj->setConfig($config); 
$obj->setFormData($formdata); 
$obj->setFileData($filedata); 
$result = $obj->send('get'); 
//$result = $obj->send('post'); 
//$result = $obj->send('multipart'); 
 
echo '<pre>'; 
print_r($result); 
echo '</pre>'; 
 
?>

完整实例代码可以点击此处本站下载。

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

PHP 相关文章推荐
使用bcompiler对PHP文件进行加密的代码
Aug 29 PHP
PHP遍历数组的几种方法
Mar 22 PHP
smarty中js的调用方法示例
Oct 27 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
ThinkPHP处理Ajax返回的方法
Nov 22 PHP
PHP实现抓取Google IP并自动修改hosts文件
Feb 12 PHP
zend framework中使用memcache的方法
Mar 04 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
php通过header发送自定义数据方法
Jan 18 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
PHP实现简单计算器小程序
Aug 28 PHP
php过滤html标记属性类用法实例
Sep 23 #PHP
php广告加载类用法实例
Sep 23 #PHP
php实现根据url自动生成缩略图的方法
Sep 23 #PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 #PHP
PHP图片库imagemagick安装方法
Sep 23 #PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 #PHP
php实现的支持断点续传的文件下载类
Sep 23 #PHP
You might like
使用phpQuery采集网页的方法
2013/11/13 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
用js生产批量批处理执行命令
2008/07/28 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
AngularJS 执行流程详细介绍
2016/08/18 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
在Linux下调试Python代码的各种方法
2015/04/17 Python
改进Django中的表单的简单方法
2015/07/17 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
python实现图片识别汽车功能
2018/11/30 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
求职自荐书范文
2013/12/04 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
初中英语教学反思
2014/01/25 职场文书
领导班子对照检查材料
2014/09/22 职场文书
热爱劳动主题班会
2015/08/14 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
文明医院的标语集锦!
2019/07/24 职场文书