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 相关文章推荐
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
使用php清除bom示例
Mar 03 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
PHP可变函数学习小结
Nov 29 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
YII分模块加载路由的实现方法
Oct 01 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 PHP
PHP接入支付宝接口失效流程详解
Nov 10 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
PHP 面向对象实现代码
2009/11/11 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
python中字符串变二维数组的实例讲解
2018/04/03 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
python opencv进行图像拼接
2020/03/27 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
大四自我鉴定范文
2013/10/06 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
关于nginx 实现jira反向代理的问题
2021/09/25 Servers