使用PHP Socket 编程模拟Http post和get请求


Posted in PHP onNovember 25, 2014

这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法。

<?php /** 

 * 使用PHP Socket 编程模拟Http post和get请求 

 * @author koma 

 */ class Http{ 

    private $sp = "\r\n"; //这里必须要写成双引号     private $protocol = 'HTTP/1.1'; 

    private $requestLine = ""; 

    private $requestHeader = ""; 

    private $requestBody = ""; 

    private $requestInfo = ""; 

    private $fp = null; 

    private $urlinfo = null; 

    private $header = array(); 

    private $body = ""; 

    private $responseInfo = ""; 

    private static $http = null; //Http对象单例     

    private function __construct() {} 

    public static function create() { 

        if ( self::$http === null ) {  

            self::$http = new Http(); 

        } 

        return self::$http; 

    } 

    public function init($url) { 

        $this->parseurl($url); 

        $this->header['Host'] = $this->urlinfo['host']; 

        return $this; 

    } 

    public function get($header = array()) { 

        $this->header = array_merge($this->header, $header); 

        return $this->request('GET'); 

    } 

    public function post($header = array(), $body = array()) { 

        $this->header = array_merge($this->header, $header); 

        if ( !empty($body) ) { 

            $this->body = http_build_query($body); 

            $this->header['Content-Type'] = 'application/x-www-form-urlencoded'; 

            $this->header['Content-Length'] = strlen($this->body); 

        } 

        return $this->request('POST'); 

    } 

    private function request($method) { 

        $header = ""; 

        $this->requestLine = $method.' '.$this->urlinfo['path'].'?'.$this->urlinfo['query'].' '.$this->protocol; 

        foreach ( $this->header as $key => $value ) { 

            $header .= $header == "" ? $key.':'.$value : $this->sp.$key.':'.$value; 

        } 

        $this->requestHeader = $header.$this->sp.$this->sp; 

        $this->requestInfo = $this->requestLine.$this->sp.$this->requestHeader; 

        if ( $this->body != "" ) { 

            $this->requestInfo .= $this->body; 

        } 

        /* 

         * 注意:这里的fsockopen中的url参数形式为"www.xxx.com" 

         * 不能够带"http://"这种 

         */

        $port = isset($this->urlinfo['port']) ? isset($this->urlinfo['port']) : '80'; 

        $this->fp = fsockopen($this->urlinfo['host'], $port, $errno, $errstr); 

        if ( !$this->fp ) { 

            echo $errstr.'('.$errno.')'; 

            return false; 

        } 

        if ( fwrite($this->fp, $this->requestInfo) ) { 

            $str = ""; 

            while ( !feof($this->fp) ) { 

                $str .= fread($this->fp, 1024); 

            } 

            $this->responseInfo = $str; 

        } 

        fclose($this->fp); 

        return $this->responseInfo; 

    } 

    private function parseurl($url) { 

        $this->urlinfo = parse_url($url); 

    } 

} // $url = "http://news.163.com/14/1102/01/AA0PFA7Q00014AED.html"; 

$url = "http://localhost/httppro/post.php"; $http = Http::create()->init($url); /* 发送get请求  

echo $http->get(array( 

    'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36', 

)); 

*/

 /* 发送post请求 */ echo $http->post(array( 

        'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36', 

), array('username'=>'发一个中文', 'age'=>22));

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 friend??');

//构造要post的字符串

foreach ($argv as $key=>$value) {

    if ($flag!=0) {

        $params .= "&";

        $flag = 1;

    }

    $params.= $key."="; $params.= urlencode($value);

    $flag = 1;

    }

    $length = strlen($params);

     //创建socket连接

    $fp = fsockopen("localhost",81,$errno,$errstr,10) or exit($errstr."--->".$errno);

    //构造post请求的头

    $header  = "POST /flandy/getpost.php HTTP/1.1\r\n";

    $header .= "Host:127.0.0.1\r\n";

    $header .= "Referer:/flandy/post.php\r\n";

    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";

    $header .= "Content-Length: ".$length."\r\n";

    $header .= "Connection: Close\r\n\r\n";

    //添加post的字符串

    $header .= $params."\r\n";

   
    //发送post的数据

    fputs($fp,$header);

    $inheader = 1;

    while (!feof($fp)) {

        $line = fgets($fp,1024); //去除请求包的头只显示页面的返回数据

        if ($inheader && ($line == "\n" || $line == "\r\n")) {

             $inheader = 0;

        }

        if ($inheader == 0) {

          echo $line;

        }

    }
fclose($fp);

?>

getpost.php的内容如下

<?php

echo "this is the data posted";

echo "<pre>";

print_r($_REQUEST);

echo "</pre>";

?>

结果输出:

this is the data postedArray

(

[var1] => abc

[var2] => how are you , my friend??

)

以上代码在本机81端口下已经通过测试。

方法二:

使用PHP的curl扩展或HttpClient.class.php类,这两个非常类似,下面简单的列出curl的实现代码。
两个文件post2.php和getpost2.php
post2.php的内容如下:

<?php

$psecode = 'NDE005';

$website = 'www.baidu.com';

$amt = 1;

$pwd = 123456;

$ch = curl_init();

$curl_url = "http://localhost:81/flandy/getpost2.php?web=" . $website .

"&pwd=" . $pwd . "&action=check&pseid=" . $psecode .

"&amt=" . $amt;

curl_setopt($ch, CURLOPT_URL, $curl_url);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不直接输出,返回到变量

$curl_result = curl_exec($ch);

$result = explode(',', $curl_result);

curl_close($ch);

print_r($result);

?>

getpost2.php的内容如下:

<?php

echo "returndata<br>";

echo "<pre>";

print_r($_REQUEST);

echo "</pre>";

?>

结果输出:

Array ( [0] => returndataArray

(

[web] => 'wwwbaiducom'

[pwd] => 123456

[action] => check

[pseid] => 'NDE005'

[amt] => 1

)

)

方法三:

这个要借助第三方类库HttpClient可以到这里下载:http://scripts.incutio.com/httpclient/

<?php

require_once 'HttpClient.class.php';

$params = array('web' => 'www.baidu.com',

'pwd' => '123456',

'action' => 'check',

'pseid' => 'NDE005',

'amt' => 1);

$pageContents = HttpClient::quickPost('http://localhost:81/flandy/getpost3.php', $params);

$result = explode(',', $pageContents);

print_r($result);

?>
PHP 相关文章推荐
php mysql数据库操作类
Jun 04 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 PHP
PHP实现异步调用方法研究与分享
Oct 27 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
浅析php中抽象类和接口的概念以及区别
Jun 27 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
简单的自定义php模板引擎
Aug 26 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
php如何把表单内容提交到数据库
Jul 08 PHP
详解thinkphp的Auth类认证
May 28 PHP
PHP实现无限极分类图文教程
Nov 25 #PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 #PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 #PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 #PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 #PHP
php使用str_replace实现输入框回车替换br的方法
Nov 24 #PHP
thinkphp循环结构用法实例
Nov 24 #PHP
You might like
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
php下实现折线图效果的代码
2007/04/28 PHP
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
php实现两个数组相加的方法
2015/02/17 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP7内核之Reference详解
2019/03/14 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
python3访问sina首页中文的处理方法
2014/02/24 Python
Python标准异常和异常处理详解
2015/02/02 Python
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
python算的上脚本语言吗
2020/06/22 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
幼儿园园长自我鉴定
2013/10/22 职场文书
英文演讲稿
2014/05/15 职场文书
2014年医德医风工作总结
2014/11/13 职场文书