Home  >  Article  >  Backend Development  >  php HTTP request class, supports GET, POST, Multipart/form-data

php HTTP request class, supports GET, POST, Multipart/form-data

黄舟
黄舟Original
2017-03-21 15:56:502267browse

PHP HTTP request class, supports GET, POST, Multipart/form-data

##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 = &#39;&#39;;
    private $_host = &#39;&#39;;
    private $_url = &#39;&#39;;
    private $_port = &#39;&#39;;
    private $_errno = &#39;&#39;;
    private $_errstr = &#39;&#39;;
    private $_timeout = 15;
    private $_fp = null;
    
    private $_formdata = array();
    private $_filedata = array();


    // 设置连接参数
    public function setConfig($config){
        $this->_ip = isset($config[&#39;ip&#39;])? $config[&#39;ip&#39;] : &#39;&#39;;
        $this->_host = isset($config[&#39;host&#39;])? $config[&#39;host&#39;] : &#39;&#39;;
        $this->_url = isset($config[&#39;url&#39;])? $config[&#39;url&#39;] : &#39;&#39;;
        $this->_port = isset($config[&#39;port&#39;])? $config[&#39;port&#39;] : &#39;&#39;;
        $this->_errno = isset($config[&#39;errno&#39;])? $config[&#39;errno&#39;] : &#39;&#39;;
        $this->_errstr = isset($config[&#39;errstr&#39;])? $config[&#39;errstr&#39;] : &#39;&#39;;
        $this->_timeout = isset($confg[&#39;timeout&#39;])? $confg[&#39;timeout&#39;] : 15;

        // 如没有设置ip,则用host代替
        if($this->_ip==&#39;&#39;){
            $this->_ip = $this->_host;
        }
    }


    // 设置表单数据
    public function setFormData($formdata=array()){
        $this->_formdata = $formdata;
    }


    // 设置文件数据
    public function setFileData($filedata=array()){
        $this->_filedata = $filedata;
    }


    // 发送数据
    public function send($type=&#39;get&#39;){

        $type = strtolower($type);

        // 检查发送类型
        if(!in_array($type, array(&#39;get&#39;,&#39;post&#39;,&#39;multipart&#39;))){
            return false;
        }

        // 检查连接
        if($this->connect()){

            switch($type){
                case &#39;get&#39;:
                    $out = $this->sendGet();
                    break;

                case &#39;post&#39;:
                    $out = $this->sendPost();
                    break;

                case &#39;multipart&#39;:
                    $out = $this->sendMultipart();
                    break;
            }

            // 空数据
            if(!$out){
                return false;
            }

            // 发送数据
            fputs($this->_fp, $out);

            // 读取返回数据
            $response = &#39;&#39;;

            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.&#39;?&#39;.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[&#39;path&#39;])){
                    $data[$filedata[&#39;name&#39;]] = file_get_contents($filedata[&#39;path&#39;]);
                }
            }
        }

        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 = &#39;---------------------------&#39;.substr(md5(rand(0,32000)),0,10);

        $data = &#39;--&#39;.$boundary."\r\n";

        // form data
        $formdata = &#39;&#39;;

        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 .= &#39;--&#39;.$boundary."\r\n";
        }

        // file data
        $filedata = &#39;&#39;;

        foreach($this->_filedata as $val){
            if(file_exists($val[&#39;path&#39;])){
                $filedata .= "content-disposition: form-data; name=\"".$val[&#39;name&#39;]."\"; filename=\"".$val[&#39;filename&#39;]."\"\r\n";
                $filedata .= "content-type: ".mime_content_type($val[&#39;path&#39;])."\r\n\r\n";
                $filedata .= implode(&#39;&#39;, file($val[&#39;path&#39;]))."\r\n";
                $filedata .= &#39;--&#39;.$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(&#39;HttpRequest.class.php&#39;);

$config = array(
            &#39;ip&#39; => &#39;demo.fdipzone.com&#39;, // 如空则用host代替
            &#39;host&#39; => &#39;demo.fdipzone.com&#39;,
            &#39;port&#39; => 80,
            &#39;errno&#39; => &#39;&#39;,
            &#39;errstr&#39; => &#39;&#39;,
            &#39;timeout&#39; => 30,
            &#39;url&#39; => &#39;/getapi.php&#39;,
            //&#39;url&#39; => &#39;/postapi.php&#39;,
            //&#39;url&#39; => &#39;/multipart.php&#39;
);

$formdata = array(
    &#39;name&#39; => &#39;fdipzone&#39;,
    &#39;gender&#39; => &#39;man&#39;
);

$filedata = array(
    array(
        &#39;name&#39; => &#39;photo&#39;,
        &#39;filename&#39; => &#39;photo.jpg&#39;,
        &#39;path&#39; => &#39;photo.jpg&#39;
    )
);

$obj = new HttpRequest();
$obj->setConfig($config);
$obj->setFormData($formdata);
$obj->setFileData($filedata);
$result = $obj->send(&#39;get&#39;);
//$result = $obj->send(&#39;post&#39;);
//$result = $obj->send(&#39;multipart&#39;);

echo &#39;<pre class="brush:php;toolbar:false">&#39;;
print_r($result);
echo &#39;
'; ?>


The above is the php HTTP request class, which supports GET, POST, Multipart/form-data content. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!


Related articles:

php method to obtain the header information of the http request

PHP implementation of obtaining the header information of the http request Steps

http request encapsulation example implemented by php

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn