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

本文实例讲述了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
, http
, 类
请求
post 请求 form data、post请求的formdata、multipart form data、multipartformdata、afmultipartformdata,以便于您获取更多的相关知识。

时间: 2024-09-20 16:58:02

PHP实现支持GET,POST,Multipart/form-data的HTTP请求类_php技巧的相关文章

PHP实现支持SSL连接的SMTP邮件发送类_php技巧

本文实例讲述了PHP实现支持SSL连接的SMTP邮件发送类.分享给大家供大家参考.具体如下: 该实例代码测试过了gmail和QQ邮箱的SMTP.具体代码如下: 复制代码 代码如下: <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件(单个或多个附件),支持到服务器的ssl连接 * 需要的php扩展:sockets.Fileinfo和openssl. * 编码格式是UTF-8,传输编码格式是base64 * @example *

php支持断点续传、分块下载的类_php技巧

本文是为大家分享php支持断点续传.分块下载的类,供大家参考,具体内容如下 <?php /** * User: djunny * Date: 2016-04-29 * Time: 17:18 * Mail: 199962760@qq.com * 支持断点下载的类 */ class downloader { /** * download file to local path * * @param $url * @param $save_file * @param int $speed * @par

php实现的支持imagemagick及gd库两种处理的缩略图生成类_php技巧

本文实例讲述了php实现的支持imagemagick及gd库两种处理的缩略图生成类及其用法实例,非常具有实用价值.分享给大家供大家参考.具体如下: 一.功能: 1.按比例缩小/放大 2.填充背景色 3.按区域裁剪 4.添加水印,包括水印的位置,透明度等 使用imagemagick/GD库实现,imagemagick地址:www.imagemagick.org 需要安装imagemagick,安装方法如下:http://www.jb51.net/article/55528.htm 二.实现方法:

PHP form 表单传参明细研究_php技巧

为什么呢?因为表单的处理有GET和POST两种,怎么在这两种表单中都要传递一直do参数,而且要在后台通过同样的方式获取就一直是个很困惑的问题,今天经过几个小时的实验终于搞懂了,特发此文. GET表单: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

php实现的支持断点续传的文件下载类_php技巧

本文实例讲述了php实现的支持断点续传的文件下载类及其用法,是非常实用的技巧.分享给大家供大家参考.具体方法如下: 通常来说,php支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现. HTTP断点续传原理: Http头 Range.Content-Range() HTTP头中一般断点下载时才用到Range和Content-Range实体头, Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300) Content-Range用

php提示Failed to write session data错误的解决方法_php技巧

本文较为详细的分析了php提示Failed to write session data错误的解决方法.分享给大家供大家参考.具体方法如下: 一.问题: 提示信息:Warning: Failed to write session data (files).Please verify that the current setting of session.save_path is correct () in Unknown on line 0 二.解决方法: 代码如下: 复制代码 代码如下: ses

让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享_php技巧

网上搜了很多方法都不奏效,研究了一天,发现通过以下的配置可以完美支持 'URL_MODEL' => 2 的情况了 复制代码 代码如下: location /project/ { index index.php; if (!-e $request_filename) { rewrite ^/project/(.*)$ /project/index.php/$1 last; break; } } location ~ .+\.php($|/) { set $script $uri; set $pat

支持php4、php5的mysql数据库操作类_php技巧

前端一直使用PHP5,的确使用起来特别的爽,现在为了能在俺的虚拟主机上跑,不得不改成PHP4的.这几个库类我以前发在PHPCHIAN,地址是http://www.phpchina.com/bbs/viewthread.php?tid=5687&highlight=.(前几天在网上搜索了下,发现很多转载我的这几篇文章都没有说明出处,而且把我的版权都删除了,气晕了.)     昨天改写了数据库操作类,恰好在我简化zend Framework也能用到.     代码如下: <?php /** * 

支持生僻字且自动识别utf-8编码的php汉字转拼音类_php技巧

拼音类文件py_class.php源码如下: <?php class py_class{ function py_class(){ $this -> pinyin = array( "a" => array(59371, 41648, 50400, 33157, 41392, 18661, 47599), "ai" => array(19697, 32178, 35504, 36856, 20712, 25068, 28663, 26608,