Heim >Backend-Entwicklung >PHP-Tutorial >PHP-HTTP-Anfrageklasse, unterstützt GET, POST, Multipart/form-data

PHP-HTTP-Anfrageklasse, unterstützt GET, POST, Multipart/form-data

黄舟
黄舟Original
2017-03-21 15:56:502273Durchsuche

PHP-HTTP-Anfrageklasse, unterstützt 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;
'; ?>


Das Obige ist die PHP-HTTP-Anforderungsklasse, die GET-, POST- und Multipart-/Formulardateninhalte unterstützt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (). www.php.cn) !

Verwandte Artikel:

So erhalten Sie die Header-Informationen einer HTTP-Anfrage in PHP

PHP-Implementierung zum Abrufen des Headers Informationen zu den Schritten der HTTP-Anfrage

Beispiel für die von PHP implementierte HTTP-Anfragekapselung

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP-Cookie-OperationsklasseNächster Artikel:PHP-Cookie-Operationsklasse