PHP模拟http请求的方法详解


Posted in PHP onNovember 09, 2016

本文实例讲述了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 posted
Array
(
  [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] => returndata
Array
(
  [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 相关文章推荐
谈谈PHP语法(4)
Oct 09 PHP
解决中英文字符串长度问题函数
Jan 16 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
php调用Google translate_tts api实现代码
Aug 07 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
php中explode函数用法分析
Nov 15 PHP
php的socket编程详解
Nov 20 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
PHP的Trait机制原理与用法分析
Oct 18 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 #PHP
浅析php-fpm静态和动态执行方式的比较
Nov 09 #PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 #PHP
thinkPHP批量删除的实现方法分析
Nov 09 #PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 #PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 #PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 #PHP
You might like
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
python操作MySQL数据库具体方法
2013/10/28 Python
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
Python @property装饰器原理解析
2020/01/22 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
自我评价200字分享
2013/12/17 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
单位介绍信格式
2015/01/31 职场文书
员工辞退通知书
2015/04/17 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS