调试时经常要模拟提交,在抓取别人页面时也经常要去请求别人的页面,于是就写了下面这个类。封装了三种post提交方法和一个request请求方法,

  1. <?php
  2. /**
  3. *  HTTP常用请求封装
  4. *
  5. *  Copyright(c) 2012 by ustb80. All rights reserved
  6. *
  7. *  To contact the author write to {@link mailto:ustb80@163.com}
  8. *
  9. * @author ustb80
  10. * @version $Id: HttpHelper.php,v 1.0 2012-8-9
  11. * @package library
  12. */
  13. // ------------------------------------------------------------------------
  14. /**
  15. * http请求处理
  16. *
  17. * 开发中经常需要模拟提交请求,本类封装了常用的post方法
  18. *
  19. * @author ustb80
  20. *
  21. */
  22. class HttpHelper
  23. {
  24. // 当前的user-agent字符串
  25. public $ua_string= "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:14.0) Gecko/20100101 Firefox/14.0.1";
  26. // 支持的提交方式
  27. public $post_type_list = array("curl", "socket", "stream");
  28. // 本地cookie文件
  29. private $cookie_file;
  30. // --------------------------------------------------------------------
  31. /**
  32. * 构造函数
  33. *
  34. * @param array $params 初始化参数
  35. */
  36. public function __construct($params = array())
  37. {
  38. if(count($params) > 0)
  39. {
  40. $this->init($params);
  41. }
  42. }
  43. // --------------------------------------------------------------------
  44. /**
  45. * 参数初始化
  46. *
  47. * @param array $params
  48. */
  49. public function init($params)
  50. {
  51. if(count($params) > 0)
  52. {
  53. foreach($params as $key => $val)
  54. {
  55. if(isset($this->$key))
  56. {
  57. $this->$key = $val;
  58. }
  59. }
  60. }
  61. }
  62. // --------------------------------------------------------------------
  63. /**
  64. * 提交请求
  65. *
  66. * @param string $url 请求地址
  67. * @param mixed $data 提交的数据
  68. * @param string $type 提交类型,curl,socket,stream可选
  69. */
  70. public function post($url, $data, $type = "socket")
  71. {
  72. if(!in_array($type, $this->post_type_list))
  73. {
  74. die("undefined post type");
  75. }
  76. $function_name = $type . "Post";
  77. return call_user_func_array(array($this, $function_name), array($url, $data));
  78. }
  79. // --------------------------------------------------------------------
  80. /**
  81. * 更改默认的ua信息
  82. *
  83. * 本方法常用于模拟各种浏览器
  84. *
  85. * @param string $ua_string UA字符串
  86. */
  87. public function setUA($user_agent)
  88. {
  89. $this->ua_string = $user_agent;
  90. return $this;
  91. }
  92. // --------------------------------------------------------------------
  93. /**
  94. * 设置本地cookie文件
  95. *
  96. * 在用curl来模拟时常需要设置此项
  97. *
  98. * @param string $cookie_file 文件路径
  99. */
  100. public function setCookieFile($cookie_file)
  101. {
  102. $this->cookie_file = $cookie_file;
  103. return $this;
  104. }
  105. // --------------------------------------------------------------------
  106. /**
  107. * curl方式提交
  108. *
  109. * @param string $url 请求地址
  110. * @param mixed $data 提交的数据
  111. * @param string $user_agent 自定义的UA
  112. * @return mixed
  113. */
  114. public function curlPost($url, $data, $user_agent = '')
  115. {
  116. if($user_agent == '')
  117. {
  118. $user_agent = $this->ua_string;
  119. }
  120. if (!is_array($data))
  121. {
  122. $data = array($data);
  123. }
  124. $data = http_build_query($data);
  125. if (!function_exists("curl_init"))
  126. {
  127. die('undefined function curl_init');
  128. }
  129. $ch = curl_init();
  130. curl_setopt($ch, CURLOPT_URL, $url);
  131. curl_setopt($ch, CURLOPT_POST, true);
  132. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  133. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  134. curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
  135. $rs = curl_exec($ch);
  136. curl_close($ch);
  137. return $rs;
  138. }
  139. // --------------------------------------------------------------------
  140. /**
  141. * 套接字提交
  142. *
  143. * @param string $url 请求地址
  144. * @param mixed $data 提交的数据
  145. * @param string $user_agent 自定义的UA
  146. * @param int $port 端口
  147. * @param int $timeout 超时限制
  148. * @return mixed
  149. */
  150. public function socketPost($url, $data, $user_agent = '', $port = 80, $timeout = 30)
  151. {
  152. $url_info = parse_url($url);
  153. $remote_server = $url_info['host'];
  154. $remote_path = $url_info['path'];
  155. $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
  156. if(!$socket)
  157. {
  158. die("$errstr($errno)");
  159. }
  160. if($user_agent == '')
  161. {
  162. $user_agent = $this->ua_string;
  163. }
  164. if (!is_array($data))
  165. {
  166. $data = array($data);
  167. }
  168. $data = http_build_query($data);
  169. fwrite($socket, "POST {$remote_path} HTTP/1.0\r\n");
  170. fwrite($socket, "User-Agent: {$user_agent}\r\n");
  171. fwrite($socket, "HOST: {$remote_server}\r\n");
  172. fwrite($socket, "Content-type: application/x-www-form-urlencoded\r\n");
  173. fwrite($socket, "Content-length: " . strlen($data) . "\r\n");
  174. fwrite($socket, "Accept:*/*\r\n");
  175. fwrite($socket, "\r\n");
  176. fwrite($socket, "{$data}\r\n");
  177. fwrite($socket, "\r\n");
  178. $header = "";
  179. while($str = trim(fgets($socket, 4096)))
  180. {
  181. $header .= $str;
  182. }
  183. $data = "";
  184. while(!feof($socket))
  185. {
  186. $data .= fgets($socket, 4096);
  187. }
  188. return $data;
  189. }
  190. // --------------------------------------------------------------------
  191. /**
  192. * 文件流提交
  193. *
  194. * @param string $url 提交地址
  195. * @param string $data 数据
  196. * @param string $user_agent 自定义的UA
  197. * @return mixed
  198. */
  199. public function streamPost($url, $data, $user_agent = '')
  200. {
  201. if($user_agent == '')
  202. {
  203. $user_agent = $this->ua_string;
  204. }
  205. if (!is_array($data))
  206. {
  207. $data = array($data);
  208. }
  209. $data = http_build_query($data);
  210. $context = array(
  211. 'http' => array(
  212. 'method' => 'POST',
  213. 'header' => 'Content-type: application/x-www-form-urlencoded' . "\r\n" . 'User-Agent : ' . $user_agent . "\r\n" . 'Content-length: ' . strlen($data),
  214. 'content' => $data
  215. )
  216. );
  217. $stream_context = stream_context_create($context);
  218. $data = file_get_contents($url, FALSE, $stream_context);
  219. return $data;
  220. }
  221. // --------------------------------------------------------------------
  222. /**
  223. * 发送请求
  224. *
  225. * 本方法通过curl函数向目标服务器发送请求
  226. *
  227. * @param string $url 请求地址
  228. * @return mixed
  229. */
  230. public function request($url)
  231. {
  232. $ch = curl_init();
  233. curl_setopt($ch, CURLOPT_URL, $url);
  234. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  235. curl_setopt($ch, CURLOPT_USERAGENT, !empty($this->ua_string)? $this->ua_string : $_SERVER['HTTP_USER_AGENT']);
  236. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  237. if (isset($this->cookie_file))
  238. {
  239. curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_file);
  240. }
  241. $data = curl_exec($ch);
  242. curl_close($ch);
  243. return $data;
  244. }
  245. }

例子:

  1. <?php
  2. require_once 'HttpHelper.php';
  3. $HttpHelper = new HttpHelper();
  4. $url = "http://localhost/post.php";
  5. $data = array("name"=>"socket");
  6. $rs[] = $HttpHelper->post($url, $data);
  7. $data = array("name"=>"curl");
  8. $rs[] = $HttpHelper->post($url, $data, "curl");
  9. $data = array("name"=>"stream");
  10. $rs[] = $HttpHelper->post($url, $data, "stream");
  11. $rs[] = $HttpHelper->request($url);
  12. print_r($rs);

post.php代码如下:

  1. <?php
  2. echo 'test request:';
  3. print_r($_REQUEST);

输出结果:

  1. Array
  2. (
  3. [0] => test request:Array
  4. (
  5. [name] => socket
  6. )
  7. [1] => test request:Array
  8. (
  9. [name] => curl
  10. )
  11. [2] => test request:Array
  12. (
  13. [name] => stream
  14. )
  15. [3] => test request:Array
  16. (
  17. )
  18. )

转载于:https://blog.51cto.com/ustb80/1043797

发布一个http请求封装类相关推荐

  1. php http 类,php写的http请求封装类

    本文介绍一个php实现的http请求封装类,封装了三种post提交方法和一个request请求方法,并提供了调用示例,供大家学习参考. 在php编程调试时,经常需要模拟提交. 另外,在抓取一些页面时, ...

  2. 【区块链】发布一个纯Python实现的EOSIO WAX SDK

    回顾 <[区块链]Python开发WAX链游脚本常用工具> 在上一篇文章中,我们介绍了Python与EOS或WAX网络交互的两个第三方开源库[eospy]和[pyeoskit]. 不过经过 ...

  3. 【WAX链游】发布一个免费开源的Alien Worlds【外星世界】合约脚本TLM

    前言 <链游Farmers World[农民世界]爆火,发布一个免费开源的脚本> 在之前的文章中,我们分享了一个开源的农民世界(Farmers World)脚本 [OpenFarmer]: ...

  4. 使用 Go 从零开发并发布一个 Kubectl 插件

    作者:KaliArch(薛磊),某 Cloud MSP 服务商产品负责人,熟悉企业级高可用/高并发架构,包括混合云架构.异地灾,熟练企业 DevOPS 改造优化,熟悉 Shell/Python/Go ...

  5. 如何在Mendix中发布一个REST Service

    目录 介绍(Introduction) REST是什么? Published REST Service 一般属性 Service Name(服务名称) Version (版本) Location 位置 ...

  6. 一文读懂一个URL请求的过程是怎样的

    前言 当我们在浏览器中输入一个URL访问地址,然后浏览器返回给我们一个响应页面,这内部过程到底是怎样的呢?下面我将从以下几个方面阐述一个 WEB请求过程到底是怎样: 浏览器缓存 DNS域名解析 TCP ...

  7. C#实现http的GET/POST请求封装类-HttpRequest

    C#实现http的GET/POST请求封装类-HttpRequest 背景 代码实现 背景 在开发微信应用时,会经常在C#服务端以Http的GET或POST方式请求钉钉平台或微信平台的接口,为了方便发 ...

  8. 给小孩发布一个有趣的网站 在线动物园

    给小孩发布一个有趣的网站 在线动物园,可以实时看到动物园里的动物实时摄像头. 非常有意思,大热天也不用到动物园里看了. http://zoo.baidu.com/video.html

  9. 一个HTTP请求的曲折经历

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:8rr.co/6usv 从一个经典的面试题说起,输入URL到 ...

最新文章

  1. android点滴(25)之 original-package
  2. java基础 知识点
  3. 英语与计算机的整合,浅谈计算机应用与英语教学的整合
  4. 【学习笔记】抽象队列同步器AQS应用之BlockingQueue详解
  5. 详解分布式协调服务 ZooKeeper
  6. 计算机控制学什么,计算机控制技术专业介绍
  7. php正文重复度,百度如何判断网页文章的重复度?两个页面相似度确认方法介绍...
  8. OpenBSD基金会收到锤子科技约140万捐赠款
  9. [Unity] ACT 战斗系统学习 2:从 Buff 系统开始的思考
  10. Windows2008R2 --Active Directory回收站
  11. Kali渗透测试工具库(二)beef--Web浏览器攻击框架
  12. QByteArray与char、int、float(及其数组)之间的互相转化
  13. 电路原理解析_接近开关检测旋转设备的工作原理
  14. mysql语句优化 explai_mysql使用explain优化sql语句
  15. 在cs页面获取input的值方法
  16. 机器视觉算法与应用总结
  17. C语言:使用函数统计指定数字的个数
  18. www 53ff com劫持IE,广告网页图标常驻桌面,删了又来
  19. docker 安装linux镜像制作,制作ubuntu完整版docker镜像
  20. js将阿拉伯数字转换成中文的大写数字

热门文章

  1. 快速pow和sqrt的小技巧 hdu4282
  2. 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)
  3. 内核ko模块strip使用
  4. C++转换构造函数和类型转换函数
  5. 【Linux系统编程学习】Linux线程控制原语
  6. SpringMVC与Struts2区别与比较总结
  7. PANEL中显示窗体
  8. C++ 网络开发工具
  9. MSCRM二次开发实现自动编号功能
  10. HotSpot 虚拟机垃圾回收算法实现