亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP封裝的HttpClient類用法實例

2024-05-04 23:36:17
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了PHP封裝的HttpClient類,可實現簡單的GET、POST、Cookie、Session等功能,需要的朋友可以參考下

本文實例講述了PHP封裝的HttpClient類。分享給大家供大家參考。具體分析如下:

這是一段php封裝的HttpClient類,可實現GET POST Cookie Session等簡單的功能。原來做過,這兩天重新修改了一下。

 

 
  1. <?php  
  2. /*  
  3. * Filename: httpclient.php  
  4. * Created on 2012-12-21  
  5. * Created by RobinTang  
  6. * To change the template for this generated file go to  
  7. * Window - Preferences - PHPeclipse - PHP - Code Templates  
  8. */ 
  9. class SinCookie {  
  10. public $name// Cookie名稱  
  11. public $value// Cookie值  
  12. // 下面三個屬性現在未實現  
  13. public $expires// 過期時間  
  14. public $path// 路徑  
  15. public $domain// 域  
  16. // 從Cookie字符串創建一個Cookie對象  
  17. function __construct($s = false) {  
  18. if ($s) {  
  19. $i1 = strpos($s'=');  
  20. $i2 = strpos($s';');  
  21. $this->name = trim(substr($s, 0, $i1));  
  22. $this->value = trim(substr($s$i1 +1, $i2 - $i1 -1));  
  23. }  
  24. }  
  25. // 獲取Cookie鍵值對  
  26. function getKeyValue() {  
  27. return "$this->name=$this->value";  
  28. }  
  29. }  
  30. // 會話上下文  
  31. class SinHttpContext {  
  32. public $cookies// 會話Cookies  
  33. public $referer// 前一個頁面地址  
  34. function __construct() {  
  35. $this->cookies = array ();  
  36. $this->refrer = "";  
  37. }  
  38. // 設置Cookie  
  39. function cookie($key$val) {  
  40. $ck = new SinCookie();  
  41. $ck->name = $key;  
  42. $ck->value = $val;  
  43. $this->addCookie($ck);  
  44. }  
  45. // 添加Cookie  
  46. function addCookie($ck) {  
  47. $this->cookies[$ck->name] = $ck;  
  48. }  
  49. // 獲取Cookies字串,請求時用到  
  50. function cookiesString() {  
  51. $res = '';  
  52. foreach ($this->cookies as $ck) {  
  53. $res .= $ck->getKeyValue() . ';';  
  54. }  
  55. return $res;  
  56. }  
  57. }  
  58. // Http請求對象  
  59. class SinHttpRequest {  
  60. public $url// 請求地址  
  61. public $method = 'GET'// 請求方法  
  62. public $host// 主機  
  63. public $path// 路徑  
  64. public $scheme// 協議,http  
  65. public $port// 端口  
  66. public $header// 請求頭  
  67. public $body// 請求正文  
  68. // 設置頭  
  69. function setHeader($k$v) {  
  70. if (!isset ($this->header)) {  
  71. $this->header = array ();  
  72. }  
  73. $this->header[$k] = $v;  
  74. }  
  75. // 獲取請求字符串  
  76. // 包含頭和請求正文  
  77. // 獲取之后直接寫socket就行  
  78. function reqString() {  
  79. $matches = parse_url($this->url);  
  80. !isset ($matches['host']) && $matches['host'] = '';  
  81. !isset ($matches['path']) && $matches['path'] = '';  
  82. !isset ($matches['query']) && $matches['query'] = '';  
  83. !isset ($matches['port']) && $matches['port'] = '';  
  84. $host = $matches['host'];  
  85. $path = $matches['path'] ? $matches['path'] . ($matches['query'] ? '?' . $matches['query'] : '') : '/';  
  86. $port = !emptyempty ($matches['port']) ? $matches['port'] : 80;  
  87. $scheme = $matches['scheme'] ? $matches['scheme'] : 'http';  
  88. $this->host = $host;  
  89. $this->path = $path;  
  90. $this->scheme = $scheme;  
  91. $this->port = $port;  
  92. $method = strtoupper($this->method);  
  93. $res = "$method $path HTTP/1.1/r/n";  
  94. $res .= "Host: $host/r/n";  
  95. if ($this->header) {  
  96. reset($this->header);  
  97. while (list ($k$v) = each($this->header)) {  
  98. if (isset ($v) && strlen($v) > 0)  
  99. $res .= "$k: $v/r/n";  
  100. }  
  101. }  
  102. $res .= "/r/n";  
  103. if ($this->body) {  
  104. $res .= $this->body;  
  105. $res .= "/r/n/r/n";  
  106. }  
  107. return $res;  
  108. }  
  109. }  
  110. // Http響應  
  111. class SinHttpResponse {  
  112. public $scheme// 協議  
  113. public $stasus// 狀態,成功的時候是ok  
  114. public $code// 狀態碼,成功的時候是200  
  115. public $header// 響應頭  
  116. public $body// 響應正文  
  117. function __construct() {  
  118. $this->header = array ();  
  119. $this->body = null;  
  120. }  
  121. function setHeader($key$val) {  
  122. $this->header[$key] = $val;  
  123. }  
  124. }  
  125. // HttpClient  
  126. class SinHttpClient {  
  127. public $keepcontext = true; // 是否維持會話  
  128. public $context// 上下文  
  129. public $request// 請求  
  130. public $response// 響應  
  131. public $debug = false; 
  132. // 是否在Debug模式, 
  133. //為true的時候會打印出請求內容和相同的頭部  
  134. function __construct() {  
  135. $this->request = new SinHttpRequest();  
  136. $this->response = new SinHttpResponse();  
  137. $this->context = new SinHttpContext();  
  138. $this->timeout = 15; // 默認的超時為15s  
  139. }  
  140. // 清除上一次的請求內容  
  141. function clearRequest() {  
  142. $this->request->body = '';  
  143. $this->request->setHeader('Content-Length', false);  
  144. $this->request->setHeader('Content-Type', false);  
  145. }  
  146. // post方法  
  147. // data為請求的數據  
  148. // 為鍵值對的時候模擬表單提交  
  149. // 其他時候為數據提交,提交的形式為xml  
  150. // 如有其他需求,請自行擴展  
  151. function post($url$data = false) {  
  152. $this->clearRequest();  
  153. if ($data) {  
  154. if (is_array($data)) {  
  155. $con = http_build_query($data);  
  156. $this->request->setHeader('Content-Type''application/x-www-form-urlencoded');  
  157. else {  
  158. $con = $data;  
  159. $this->request->setHeader('Content-Type''text/xml; charset=utf-8');  
  160. }  
  161. $this->request->body = $con;  
  162. $this->request->method = "POST";  
  163. $this->request->setHeader('Content-Length'strlen($con));  
  164. }  
  165. $this->startRequest($url);  
  166. }  
  167. // get方法  
  168. function get($url) {  
  169. $this->clearRequest();  
  170. $this->request->method = "GET";  
  171. $this->startRequest($url);  
  172. }  
  173. // 該方法為內部調用方法,不用直接調用  
  174. function startRequest($url) {  
  175. $this->request->url = $url;  
  176. if ($this->keepcontext) {  
  177. // 如果保存上下文的話設置相關信息  
  178. $this->request->setHeader('Referer'$this->context->refrer);  
  179. $cks = $this->context->cookiesString();  
  180. if (strlen($cks) > 0)  
  181. $this->request->setHeader('Cookie'$cks);  
  182. }  
  183. // 獲取請求內容  
  184. $reqstring = $this->request->reqString();  
  185. if ($this->debug)  
  186. echo "Request:/n$reqstring/n";  
  187. try {  
  188. $fp = fsockopen($this->request->host, $this->request->port, $errno$errstr$this->timeout);  
  189. } catch (Exception $ex) {  
  190. echo $ex->getMessage();  
  191. exit (0);  
  192. }  
  193. if ($fp) {  
  194. stream_set_blocking($fp, true);  
  195. stream_set_timeout($fp$this->timeout);  
  196. // 寫數據  
  197. fwrite($fp$reqstring);  
  198. $status = stream_get_meta_data($fp);  
  199. if (!$status['timed_out']) { //未超時  
  200. // 下面的循環用來讀取響應頭部  
  201. while (!feof($fp)) {  
  202. $h = fgets($fp);  
  203. if ($this->debug)  
  204. echo $h;  
  205. if ($h && ($h == "/r/n" || $h == "/n"))  
  206. break;  
  207. $pos = strpos($h':');  
  208. if ($pos) {  
  209. $k = strtolower(trim(substr($h, 0, $pos)));  
  210. $v = trim(substr($h$pos +1));  
  211. if ($k == 'set-cookie') {  
  212. // 更新Cookie  
  213. if ($this->keepcontext) {  
  214. $this->context->addCookie(new SinCookie($v));  
  215. }  
  216. else {  
  217. // 添加到頭里面去  
  218. $this->response->setHeader($k$v);  
  219. }  
  220. else {  
  221. // 第一行數據  
  222. // 解析響應狀態  
  223. $preg = '/^(/S*) (/S*) (.*)$/';  
  224. preg_match_all($preg$h$arr);  
  225. isset ($arr[1][0]) & $this->response->scheme = trim($arr[1][0]);  
  226. isset ($arr[2][0]) & $this->response->stasus = trim($arr[2][0]);  
  227. isset ($arr[3][0]) & $this->response->code = trim($arr[3][0]);  
  228. }  
  229. }  
  230. // 獲取響應正文長度  
  231. $len = (int) $this->response->header['content-length'];  
  232. $res = '';  
  233. // 下面的循環讀取正文  
  234. while (!feof($fp) && $len > 0) {  
  235. $c = fread($fp$len);  
  236. $res .= $c;  
  237. $len -= strlen($c);  
  238. }  
  239. $this->response->body = $res;  
  240. }  
  241. // 關閉Socket  
  242. fclose($fp);  
  243. // 把返回保存到上下文維持中  
  244. $this->context->refrer = $url;  
  245. }  
  246. }  
  247. }  
  248. // demo  
  249. // now let begin test it  
  250. $client = new SinHttpClient(); // create a client  
  251. $client->get('http://www.baidu.com/'); // get  
  252. echo $client->response->body; // echo  
  253. ?> 

希望本文所述對大家的php程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品亚洲视频| 91久热免费在线视频| 亚洲精品乱码久久久久久金桔影视| 国产精品久久久久久一区二区| 亚洲欧美综合图区| 亚洲天堂第一页| 日韩在线中文字幕| 亚洲在线一区二区| 精品高清一区二区三区| 国产91对白在线播放| 亚洲国产美女精品久久久久∴| 国内揄拍国内精品少妇国语| 欧美午夜激情小视频| 日韩精品免费在线视频观看| 亚洲色无码播放| 成人春色激情网| 91黄色8090| 久久艹在线视频| 亚洲一区久久久| 欧美黑人巨大xxx极品| 欧美另类极品videosbestfree| 久久久伊人欧美| 欧美成人一区在线| 91欧美激情另类亚洲| 日韩成人中文字幕在线观看| 91精品久久久久久久久久入口| 久久久久久久久久久91| 欧美激情视频一区| 国产日韩欧美电影在线观看| 成人av电影天堂| 日产精品99久久久久久| 国产精品视频中文字幕91| 91精品啪在线观看麻豆免费| 日本精品性网站在线观看| 亚洲综合日韩中文字幕v在线| 日韩精品丝袜在线| 亚洲性无码av在线| 亚洲欧美精品中文字幕在线| 欧美日韩国产123| 亚洲精品网址在线观看| 亚洲欧美制服另类日韩| 91久热免费在线视频| 亚洲欧美日韩国产成人| 一区二区三区视频免费在线观看| 成人精品视频在线| 欧美激情视频在线观看| 欧美大码xxxx| 亚洲国语精品自产拍在线观看| 欧美最猛性xxxxx(亚洲精品)| 色综合天天狠天天透天天伊人| 国产精品香蕉在线观看| 伊人伊成久久人综合网小说| 91禁外国网站| 午夜精品福利电影| 久久精品国产亚洲一区二区| 日韩电影第一页| 精品国偷自产在线| 久久天天躁夜夜躁狠狠躁2022| 欧美特级www| 国产91精品黑色丝袜高跟鞋| 亚洲国产精品福利| 国产在线播放不卡| 成人久久久久久久| 国产欧美日韩最新| 国产精品美女免费| 亚洲曰本av电影| 国产一区二区三区在线视频| 亚洲精品国产拍免费91在线| 少妇激情综合网| 疯狂做受xxxx欧美肥白少妇| 国产日韩换脸av一区在线观看| 日韩一二三在线视频播| 亚洲精品小视频在线观看| 亚洲福利小视频| 日本欧美一级片| 久久精品成人欧美大片| 亚洲第一网站免费视频| 97**国产露脸精品国产| 中日韩美女免费视频网址在线观看| 热re91久久精品国99热蜜臀| 欧美成人在线网站| 亚洲国产高清福利视频| 日韩成人在线电影网| 日韩中文在线中文网在线观看| 亚洲日韩中文字幕在线播放| 国产色婷婷国产综合在线理论片a| 国产91精品久久久| 成人性生交大片免费观看嘿嘿视频| 亚洲国产精品小视频| 色樱桃影院亚洲精品影院| 成人444kkkk在线观看| 69视频在线播放| 亚洲福利在线播放| 国内精品模特av私拍在线观看| 国产精品久久久久久久app| 日韩高清电影免费观看完整版| 成人免费视频xnxx.com| 亚洲国产精品人久久电影| 精品亚洲夜色av98在线观看| 成人激情视频在线观看| 精品激情国产视频| 亚洲va欧美va国产综合剧情| 免费av在线一区| 亚洲视频视频在线| 亚洲精品第一国产综合精品| 国产午夜精品一区理论片飘花| 亚洲精品资源在线| 日本a级片电影一区二区| 国产精品69久久| 国产精品久久久久不卡| 色悠悠久久久久| 久久久久久久国产精品| 尤物精品国产第一福利三区| 欧美超级免费视 在线| 亚洲一级免费视频| 国产精品日韩欧美综合| 亚洲人成在线播放| 国产一区二区三区在线播放免费观看| 日韩av在线一区二区| 国产精品久久久久久久久久久新郎| 国产精品专区h在线观看| 久久精品国产99国产精品澳门| 欧美猛少妇色xxxxx| 欧美性生交xxxxxdddd| 国产精品久久久久99| 亚洲人成网站在线播| 国产国语刺激对白av不卡| 久久综合久久88| 国产热re99久久6国产精品| 久久久久久尹人网香蕉| 成人h视频在线观看播放| 欧美极度另类性三渗透| 欧洲成人免费aa| 精品香蕉一区二区三区| 亚洲一区二区自拍| 日韩中文字幕av| 亚洲天堂免费观看| 欧美激情精品久久久久久| 日韩欧美一区二区在线| 日韩视频免费在线| 一区二区三区回区在观看免费视频| 日韩视频永久免费观看| 国产精品视频网址| 69国产精品成人在线播放| 久久精品国产亚洲| 日韩二区三区在线| 亚洲自拍小视频免费观看| 97久久久免费福利网址| 成人啪啪免费看| 日本免费在线精品| 欧美色videos| 热99在线视频| 国产成人精品电影| 精品偷拍各种wc美女嘘嘘| 久久夜色精品国产欧美乱| 欧美激情va永久在线播放| 久久香蕉国产线看观看网| 欧美精品18videosex性欧美| 国产精品夜间视频香蕉| 国产精品影片在线观看| 欧美大片欧美激情性色a∨久久| 97精品视频在线| 国产一区二区三区在线观看网站| 色综合久久天天综线观看|