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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • 使用php的HTTP请求的库Requests实现美女图片墙

    使用百度的接口获取美女图片,并用瀑布流的形式展示到自己的页面中. github项目地址:https://github.com/CraryPrimitiveMan/pretty 最终效果如下: 点开百度图片的美女频道,http://image.baidu.com/channel?c=%E7%BE%8E%E5%A5%B3#%E7%BE%8E%E5%A5%B3 打开chrome的调试工具或者firefox的firebug工具,将滚动条拖到最下面,可以再network中看到如下请求: 其参数如下: 通过

  • PHP获取http请求的头信息实现步骤

    PHP手册提供了现成的函数: getallheaders (PHP 4, PHP 5) getallheaders - Fetch all HTTP request headers 说明 array getallheaders ( void ) Fetches all HTTP headers from the current request. This function is an alias for apache_request_headers(). Please read theapach

  • php 利用socket发送HTTP请求(GET,POST)

    今天给大家带来的是如何利用socket发送GET,POST请求.我借用燕十八老师封装好的一个Http类给进行说明. 在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可否利用其它方式提出GET,POST请求呢?答案必然是肯定的.了解过HTTP协议的人知道,浏览器提交请求的实质是向服务器发送一个请求信息,这个请求信息有请求行,请求头,请求体(非必须)构成.服务器根据请求信息返回一个响应信息.连接断开. HTTP请求的格式如下所示: <request-line

  • 浅谈PHP发送HTTP请求的几种方式

    PHP 开发中我们常用 cURL 方式封装 HTTP 请求,什么是 cURL? cURL 是一个用来传输数据的工具,支持多种协议,如在 Linux 下用 curl 命令行可以发送各种 HTTP 请求.PHP 的 cURL 是一个底层的库,它能根据不同协议跟各种服务器通讯,HTTP 协议是其中一种. 现代化的 PHP 开发框架中经常会用到一个包,叫做 GuzzleHttp,它是一个 HTTP 客户端,也可以用来发送各种 HTTP 请求,那么它的实现原理是什么,与 cURL 有何不同呢? Does

  • php发送http请求的常用方法分析

    本文实例讲述了php发送http请求的常用方法.分享给大家供大家参考,具体如下: http请求有get,post. php发送http请求有三种方式[我所知道的有三种,有其他的告诉我]. 1. file_get_contents();详情见:http://www.jb51.net/article/41833.htm 2. curl发送请求. 3. fsocket发送. 下面说使用curl发送. 首先环境需要配置好curl组件. 在windows中让php支持curl比较简单: 在php.ini中

  • php实现的http请求封装示例

    本文实例讲述了php的http请求封装.分享给大家供大家参考,具体如下: /** * 发送HTTP请求方法,目前只支持CURL发送请求 * @param string $url 请求URL * @param array $params 请求参数 * @param string $method 请求方法GET/POST * @return array $data 响应数据 */ protected function http($url, $params, $method = 'GET', $hea

  • php模拟asp中的XmlHttpRequest实现http请求的代码

    类名 :HttpRequest($url="",$method="GET",$useSocket=0) //$url为请求的地址:默认请求方法为GET:$useSocket默认为0,使用fsockopen方法,如果设置为1则使用socket_create方法 方法: open($ip="",$port=-1) //打开同服务器的连接,默认不用设置这两个参数(一个同事在linux用的时候,请求的不是hostname解析的IP,因此加了这两个参数,以

  • PHP使用socket发送HTTP请求的方法

    本文实例讲述了PHP使用socket发送HTTP请求的方法.分享给大家供大家参考,具体如下: socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0)); socket_connect($socket, 'www.bai

  • PHP实现取得HTTP请求的原文

    本文实例讲述了PHP实现取得HTTP请求的原文的方法,具体步骤如下: 1. 取得请求行:Method.URI.协议 可以从超级变量$_SERVER中获得,三个变量的值如下: $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n"; 2. 取得所有Header PHP有个内置函数getallheader(),是apache_request_headers()

  • PHP模拟http请求的方法详解

    本文实例讲述了PHP模拟http请求的方法.分享给大家供大家参考,具体如下: 方法一:利用php的socket编程来直接给接口发送数据来模拟post的操作. 建立两个文件post.php,getpost.php post.php内容如下: <?php $flag = 0; $params = ''; $errno = ''; $errstr = ''; //要post的数据 $argv = array( 'var1'=>'abc', 'var2'=>'how are you , my f

随机推荐