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 相关文章推荐
mysql limit查询优化分析
Nov 12 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
如何用PHP实现插入排序?
Apr 10 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 PHP
PHP整合七牛实现上传文件
Jul 03 PHP
php通过文件头判断格式的方法
May 28 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
PHP fopen函数用法实例讲解
Feb 15 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
Oct 10 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
YB217、YB235、YB400浅听
2021/03/02 无线电
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python中的自定义函数学习笔记
2014/09/23 Python
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
极简的Python入门指引
2015/04/01 Python
使用python绘制常用的图表
2016/08/27 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
详解python读取image
2019/04/03 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
python 怎样进行内存管理
2020/11/10 Python
python try...finally...的实现方法
2020/11/25 Python
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
Nginx反向代理配置的全过程记录
2021/06/22 Servers