侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

php  /  管理员 发布于 7年前   439

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

HttpRequest.class.php类文件如下:

_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示例程序如下:

 '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 '
'; print_r($result); echo '
'; ?>

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

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

您可能感兴趣的文章:

  • php处理restful请求的路由类分享
  • 通过JS和PHP两种方法判断用户请求时使用的浏览器类型
  • php自定义类fsocket模拟post或get请求的方法
  • 解读PHP的Yii框架中请求与响应的处理流程
  • YII2框架中使用yii.js实现的post请求
  • yii2 在控制器中验证请求参数的使用方法
  • Yii框架通过请求组件处理get,post请求的方法分析
  • Yii 框架控制器创建使用及控制器响应操作示例
  • Yii框架响应组件用法实例分析
  • Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
  • YII Framework学习之request与response用法(基于CHttpRequest响应)
  • PHP封装请求类实例分析【基于Yii框架】


  • 上一条:
    php实现的Cookies操作类实例
    下一条:
    php过滤html标记属性类用法实例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客