Heim >Backend-Entwicklung >PHP-Tutorial >php写的http请求封装类

php写的http请求封装类

WBOY
WBOYOriginal
2016-07-25 08:58:241625Durchsuche
本文介绍一个php实现的http请求封装类,封装了三种post提交方法和一个request请求方法,并提供了调用示例,供大家学习参考。

在php编程调试时,经常需要模拟提交。 另外,在抓取一些页面时,需要经常请求别人的页面。

于是实现了一个http请求的封装类,以方便调用。 本http请求类,封装了三种post提交方法和一个request请求方法。

1,http请求封闭类

<?php
    /**
     *  HTTP常用请求封装
     * @version $Id: HttpHelper.php,v 1.0 2012-8-9
     * @package library
     * @site bbs.it-home.org
     */

    // ---------------------------

    /**
     * http请求处理
     *
     * 开发中经常需要模拟提交请求,本类封装了常用的post方法
     *
     * @author ustb80
     *
     */
    class HttpHelper
    {
        // 当前的user-agent字符串
        public $ua_string= "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:14.0) Gecko/20100101 Firefox/14.0.1";

        // 支持的提交方式
        public $post_type_list = array("curl", "socket", "stream");

        // 本地cookie文件
        private $cookie_file;

        // -----------------------

        /**
         * 构造函数
         *
         * @param array $params 初始化参数
         */
        public function __construct($params = array())
        {
            if(count($params) > 0)
            {
                $this->init($params);
            }
        }

        // -----------------------

        /**
         * 参数初始化
         *
         * @param array $params
         */
        public function init($params)
        {
            if(count($params) > 0)
            {
                foreach($params as $key => $val)
                {
                    if(isset($this->$key))
                    {
                        $this->$key = $val;
                    }
                }
            }
        }

        // -----------------------

        /**
         * 提交请求
         *
         * @param string $url 请求地址
         * @param mixed $data 提交的数据
         * @param string $type 提交类型,curl,socket,stream可选
         */
        public function post($url, $data, $type = "socket")
        {
            if(!in_array($type, $this->post_type_list))
            {
                die("undefined post type");
            }
            $function_name = $type . "Post";
            return call_user_func_array(array($this, $function_name), array($url, $data));
        }

        // -----------------------

        /**
         * 更改默认的ua信息
         *
         * 本方法常用于模拟各种浏览器
         *
         * @param string $ua_string UA字符串
         */
        public function setUA($user_agent)
        {
            $this->ua_string = $user_agent;
            return $this;
        }

        // -----------------------

        /**
         * 设置本地cookie文件
         *
         * 在用curl来模拟时常需要设置此项
         *
         * @param string $cookie_file 文件路径
         */
        public function setCookieFile($cookie_file)
        {
            $this->cookie_file = $cookie_file;
            return $this;
        }

        // -----------------------

        /**
         * curl方式提交
         *
         * @param string $url 请求地址
         * @param mixed $data 提交的数据
         * @param string $user_agent 自定义的UA
         * @return mixed
         */
        public function curlPost($url, $data, $user_agent = '')
        {
            if($user_agent == '')
            {
                $user_agent = $this->ua_string;
            }

            if (!is_array($data))
            {
                $data = array($data);
            }

            $data = http_build_query($data);

            if (!function_exists("curl_init"))
            {
                die('undefined function curl_init');
            }

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
            $rs = curl_exec($ch);
            curl_close($ch);
            return $rs;
        }

        // -----------------------

        /**
         * 套接字提交
         *
         * @param string $url 请求地址
         * @param mixed $data 提交的数据
         * @param string $user_agent 自定义的UA
         * @param int $port 端口
         * @param int $timeout 超时限制
         * @return mixed
         */
        public function socketPost($url, $data, $user_agent = '', $port = 80, $timeout = 30)
        {
            $url_info = parse_url($url);
            $remote_server = $url_info['host'];
            $remote_path = $url_info['path'];
            $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
            if(!$socket)
            {
                die("$errstr($errno)");
            }

            if($user_agent == '')
            {
                $user_agent = $this->ua_string;
            }

            if (!is_array($data))
            {
                $data = array($data);
            }

            $data = http_build_query($data);

            fwrite($socket, "POST {$remote_path} HTTP/1.0\r\n");
            fwrite($socket, "User-Agent: {$user_agent}\r\n");
            fwrite($socket, "HOST: {$remote_server}\r\n");
            fwrite($socket, "Content-type: application/x-www-form-urlencoded\r\n");
            fwrite($socket, "Content-length: " . strlen($data) . "\r\n");
            fwrite($socket, "Accept:*/*\r\n");
            fwrite($socket, "\r\n");
            fwrite($socket, "{$data}\r\n");
            fwrite($socket, "\r\n");

            $header = "";
            while($str = trim(fgets($socket, 4096)))
            {
                $header .= $str;
            }

            $data = "";
            while(!feof($socket))
            {
                $data .= fgets($socket, 4096);
            }

            return $data;
        }

        // -----------------------

        /**
         * 文件流提交
         *
         * @param string $url 提交地址
         * @param string $data 数据
         * @param string $user_agent 自定义的UA
         * @return mixed
         */
        public function streamPost($url, $data, $user_agent = '')
        {
            if($user_agent == '')
            {
                $user_agent = $this->ua_string;
            }

            if (!is_array($data))
            {
                $data = array($data);
            }

            $data = http_build_query($data);
            $context = array(
                    'http' => array(
                            'method' => 'POST',
                            'header' => 'Content-type: application/x-www-form-urlencoded'
 . "\r\n" . 'User-Agent : ' . $user_agent . "\r\n" . 'Content-length: ' . strlen($data),
                            'content' => $data
                    )
            );
            $stream_context = stream_context_create($context);
            $data = file_get_contents($url, FALSE, $stream_context);
            return $data;
        }

        // -----------------------

        /**
         * 发送请求
         *
         * 本方法通过curl函数向目标服务器发送请求
         *
         * @param string $url 请求地址
         * @return mixed
         */
        public function request($url)
        {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_USERAGENT, !empty($this->ua_string)? $this->ua_string : $_SERVER['HTTP_USER_AGENT']);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

            if (isset($this->cookie_file))
            {
                curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_file);
            }
            $data = curl_exec($ch);
            curl_close($ch);

            return $data;
        }
    }
?>

调用示例:

<?php
    require_once 'HttpHelper.php';
    $HttpHelper = new HttpHelper();

    $url = "http://localhost/post.php";

    $data = array("name"=>"socket");
    $rs[] = $HttpHelper->post($url, $data);

    $data = array("name"=>"curl");
    $rs[] = $HttpHelper->post($url, $data, "curl");

    $data = array("name"=>"stream");
    $rs[] = $HttpHelper->post($url, $data, "stream");

    $rs[] = $HttpHelper->request($url);

    print_r($rs);
?>

3,post.php文件:

<?php
    echo 'test request:';
    print_r($_REQUEST);
?>

4,输出结果:

Array ( [0] => test request:Array ( [name] => socket )

[1] => test request:Array ( [name] => curl )

[2] => test request:Array ( [name] => stream )

[3] => test request:Array ( )

)



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