- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP封装的HttpClient类用法实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了PHP封装的HttpClient类。分享给大家供大家参考。具体分析如下:
这是一段php封装的HttpClient类,可实现GET POST Cookie Session等简单的功能。原来做过,这两天重新修改了一下.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
<?php
/*
* Filename: httpclient.php
* Created on 2012-12-21
* Created by RobinTang
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
class
SinCookie {
public
$name
;
// Cookie名称
public
$value
;
// Cookie值
// 下面三个属性现在未实现
public
$expires
;
// 过期时间
public
$path
;
// 路径
public
$domain
;
// 域
// 从Cookie字符串创建一个Cookie对象
function
__construct(
$s
= false) {
if
(
$s
) {
$i1
=
strpos
(
$s
,
'='
);
$i2
=
strpos
(
$s
,
';'
);
$this
->name = trim(
substr
(
$s
, 0,
$i1
));
$this
->value = trim(
substr
(
$s
,
$i1
+1,
$i2
-
$i1
-1));
}
}
// 获取Cookie键值对
function
getKeyValue() {
return
"$this->name=$this->value"
;
}
}
// 会话上下文
class
SinHttpContext {
public
$cookies
;
// 会话Cookies
public
$referer
;
// 前一个页面地址
function
__construct() {
$this
->cookies =
array
();
$this
->refrer =
""
;
}
// 设置Cookie
function
cookie(
$key
,
$val
) {
$ck
=
new
SinCookie();
$ck
->name =
$key
;
$ck
->value =
$val
;
$this
->addCookie(
$ck
);
}
// 添加Cookie
function
addCookie(
$ck
) {
$this
->cookies[
$ck
->name] =
$ck
;
}
// 获取Cookies字串,请求时用到
function
cookiesString() {
$res
=
''
;
foreach
(
$this
->cookies
as
$ck
) {
$res
.=
$ck
->getKeyValue() .
';'
;
}
return
$res
;
}
}
// Http请求对象
class
SinHttpRequest {
public
$url
;
// 请求地址
public
$method
=
'GET'
;
// 请求方法
public
$host
;
// 主机
public
$path
;
// 路径
public
$scheme
;
// 协议,http
public
$port
;
// 端口
public
$header
;
// 请求头
public
$body
;
// 请求正文
// 设置头
function
setHeader(
$k
,
$v
) {
if
(!isset (
$this
->header)) {
$this
->header =
array
();
}
$this
->header[
$k
] =
$v
;
}
// 获取请求字符串
// 包含头和请求正文
// 获取之后直接写socket就行
function
reqString() {
$matches
=
parse_url
(
$this
->url);
!isset (
$matches
[
'host'
]) &&
$matches
[
'host'
] =
''
;
!isset (
$matches
[
'path'
]) &&
$matches
[
'path'
] =
''
;
!isset (
$matches
[
'query'
]) &&
$matches
[
'query'
] =
''
;
!isset (
$matches
[
'port'
]) &&
$matches
[
'port'
] =
''
;
$host
=
$matches
[
'host'
];
$path
=
$matches
[
'path'
] ?
$matches
[
'path'
] . (
$matches
[
'query'
] ?
'?'
.
$matches
[
'query'
] :
''
) :
'/'
;
$port
= !
empty
(
$matches
[
'port'
]) ?
$matches
[
'port'
] : 80;
$scheme
=
$matches
[
'scheme'
] ?
$matches
[
'scheme'
] :
'http'
;
$this
->host =
$host
;
$this
->path =
$path
;
$this
->scheme =
$scheme
;
$this
->port =
$port
;
$method
=
strtoupper
(
$this
->method);
$res
=
"$method $path HTTP/1.1\r\n"
;
$res
.=
"Host: $host\r\n"
;
if
(
$this
->header) {
reset(
$this
->header);
while
(list (
$k
,
$v
) = each(
$this
->header)) {
if
(isset (
$v
) &&
strlen
(
$v
) > 0)
$res
.=
"$k: $v\r\n"
;
}
}
$res
.=
"\r\n"
;
if
(
$this
->body) {
$res
.=
$this
->body;
$res
.=
"\r\n\r\n"
;
}
return
$res
;
}
}
// Http响应
class
SinHttpResponse {
public
$scheme
;
// 协议
public
$stasus
;
// 状态,成功的时候是ok
public
$code
;
// 状态码,成功的时候是200
public
$header
;
// 响应头
public
$body
;
// 响应正文
function
__construct() {
$this
->header =
array
();
$this
->body = null;
}
function
setHeader(
$key
,
$val
) {
$this
->header[
$key
] =
$val
;
}
}
// HttpClient
class
SinHttpClient {
public
$keepcontext
= true;
// 是否维持会话
public
$context
;
// 上下文
public
$request
;
// 请求
public
$response
;
// 响应
public
$debug
= false;
// 是否在Debug模式,
//为true的时候会打印出请求内容和相同的头部
function
__construct() {
$this
->request =
new
SinHttpRequest();
$this
->response =
new
SinHttpResponse();
$this
->context =
new
SinHttpContext();
$this
->timeout = 15;
// 默认的超时为15s
}
// 清除上一次的请求内容
function
clearRequest() {
$this
->request->body =
''
;
$this
->request->setHeader(
'Content-Length'
, false);
$this
->request->setHeader(
'Content-Type'
, false);
}
// post方法
// data为请求的数据
// 为键值对的时候模拟表单提交
// 其他时候为数据提交,提交的形式为xml
// 如有其他需求,请自行扩展
function
post(
$url
,
$data
= false) {
$this
->clearRequest();
if
(
$data
) {
if
(
is_array
(
$data
)) {
$con
= http_build_query(
$data
);
$this
->request->setHeader(
'Content-Type'
,
'application/x-www-form-urlencoded'
);
}
else
{
$con
=
$data
;
$this
->request->setHeader(
'Content-Type'
,
'text/xml; charset=utf-8'
);
}
$this
->request->body =
$con
;
$this
->request->method =
"POST"
;
$this
->request->setHeader(
'Content-Length'
,
strlen
(
$con
));
}
$this
->startRequest(
$url
);
}
// get方法
function
get(
$url
) {
$this
->clearRequest();
$this
->request->method =
"GET"
;
$this
->startRequest(
$url
);
}
// 该方法为内部调用方法,不用直接调用
function
startRequest(
$url
) {
$this
->request->url =
$url
;
if
(
$this
->keepcontext) {
// 如果保存上下文的话设置相关信息
$this
->request->setHeader(
'Referer'
,
$this
->context->refrer);
$cks
=
$this
->context->cookiesString();
if
(
strlen
(
$cks
) > 0)
$this
->request->setHeader(
'Cookie'
,
$cks
);
}
// 获取请求内容
$reqstring
=
$this
->request->reqString();
if
(
$this
->debug)
echo
"Request:\n$reqstring\n"
;
try
{
$fp
=
fsockopen
(
$this
->request->host,
$this
->request->port,
$errno
,
$errstr
,
$this
->timeout);
}
catch
(Exception
$ex
) {
echo
$ex
->getMessage();
exit
(0);
}
if
(
$fp
) {
stream_set_blocking(
$fp
, true);
stream_set_timeout(
$fp
,
$this
->timeout);
// 写数据
fwrite(
$fp
,
$reqstring
);
$status
= stream_get_meta_data(
$fp
);
if
(!
$status
[
'timed_out'
]) {
//未超时
// 下面的循环用来读取响应头部
while
(!
feof
(
$fp
)) {
$h
=
fgets
(
$fp
);
if
(
$this
->debug)
echo
$h
;
if
(
$h
&& (
$h
==
"\r\n"
||
$h
==
"\n"
))
break
;
$pos
=
strpos
(
$h
,
':'
);
if
(
$pos
) {
$k
=
strtolower
(trim(
substr
(
$h
, 0,
$pos
)));
$v
= trim(
substr
(
$h
,
$pos
+1));
if
(
$k
==
'set-cookie'
) {
// 更新Cookie
if
(
$this
->keepcontext) {
$this
->context->addCookie(
new
SinCookie(
$v
));
}
}
else
{
// 添加到头里面去
$this
->response->setHeader(
$k
,
$v
);
}
}
else
{
// 第一行数据
// 解析响应状态
$preg
=
'/^(\S*) (\S*) (.*)$/'
;
preg_match_all(
$preg
,
$h
,
$arr
);
isset (
$arr
[1][0]) &
$this
->response->scheme = trim(
$arr
[1][0]);
isset (
$arr
[2][0]) &
$this
->response->stasus = trim(
$arr
[2][0]);
isset (
$arr
[3][0]) &
$this
->response->code = trim(
$arr
[3][0]);
}
}
// 获取响应正文长度
$len
= (int)
$this
->response->header[
'content-length'
];
$res
=
''
;
// 下面的循环读取正文
while
(!
feof
(
$fp
) &&
$len
> 0) {
$c
=
fread
(
$fp
,
$len
);
$res
.=
$c
;
$len
-=
strlen
(
$c
);
}
$this
->response->body =
$res
;
}
// 关闭Socket
fclose(
$fp
);
// 把返回保存到上下文维持中
$this
->context->refrer =
$url
;
}
}
}
// demo
// now let begin test it
$client
=
new
SinHttpClient();
// create a client
$client
->get(
'http://www.baidu.com/'
); // get
echo
$client
->response->body;
// echo
?>
|
希望本文所述对大家的php程序设计有所帮助.
最后此篇关于PHP封装的HttpClient类用法实例的文章就讲到这里了,如果你想了解更多关于PHP封装的HttpClient类用法实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我看到很多人发布关于 NullInjectorError: No provider for HttpClient! 的问题但是我在 Karma 单元测试中遇到了更具描述性的错误。我一直在学习 Angu
全部, 我创造: public static final HttpClient DEFAULT_HTTPCLIENT = HttpClients .createDefault(); f
我正在使用 HttpClient fluent api 编写验收测试,但遇到了一些麻烦。 @When("^I submit delivery address and delivery time$")
有人可以分享如何配置现代 HttpClient 4.5.3 以重试失败的请求并在每次重试前等待一段时间吗? 到目前为止,我似乎正确理解了 .setRetryHandler(new DefaultHtt
我在使用 java 中的 HttpClient 库时遇到问题。 目标网站在 SSL ( https://www.betcris.com ) 上,我可以从该网站加载索引页面就好了。 但是,显示不同运动赔
所以我的应用涉及大量网络调用(可能连接到 10 个不同的服务器)和获取数据。从我读过的几篇文章中,建议重用 HTTPClient 实例,因为它可以防止资源(套接字等)的浪费。但是我发现围绕可扩展且健壮
我正在调用一个外部 API,并希望我的 API 可以进行单元测试。为此,我正在尝试包装 HttpClient。我现在只需要一种方法。 这是我的界面。 public interface IHttpCli
出于调试目的,我希望看到将要发送的原始请求。有没有一种方法可以直接从 HttpPost 或 HttpClient 的API中获得没有HTTP监视器的信息? 我发现了一些“几乎”重复的问题,但不是针对这
我正在尝试在小型 WebAssemply 应用程序(使用 .NET 5 创建)中测试 HttpClient。program.cs 包含以下语句来添加 HttpClient 服务: builder.Se
我在 Application_Start 事件中创建了 HttpClient 的单个实例,以便在 Global.asax.cs 中的应用程序中重用 应用程序启动中的代码: protected
我对此有点新手...基本上我需要运行一个脚本来从谷歌趋势下载.csv 文件。我按照这个reference写了下面的代码,代码如下: HttpClient client = new Defau
我正在尝试实现一个基本的 1 spout - 1 bolt Storm 拓扑。我有一个 Storm Bolt,可以使用 Apache HttpClient (4.3.1) 发出 HTTP 请求。但是,
我正在尝试在我的 Xamarin.Forms 移动应用程序中使用 HttpClient 创建网络服务层。 没有单例模式 单例模式 在第一种方法中,我在每个新请求中创建新的 http 客户端对象通过移动
在下面的示例中,我创建了一个 Java 11 httpClient,然后创建了多个并发 HttpRequest。 这是不好的做法吗? 每个 HttpRequest 都应该有自己的 HttpClient
我正在开发一个 Drupal 8 自定义模块。我在任何节点类型中都有两个字段(url 和文本 html 字段)。这是该模块所期望的功能: 该模块将抓取“url字段”的页面并复制html代码以将它们粘贴
我正在为 httpclient 使用 apache httpcompnonents 库。我想在多线程应用程序中使用它,其中线程数会非常高,并且会有频繁的 http 调用。这是我用来在执行调用后读取响应
最近我将我的代码库从 .net core 1.0 迁移到 2.0 。之后,我随机收到错误 “使用 System.Net.Http.HttpClient 时服务器返回无效或无法识别的响应错误”。我在 1
我有该代码: while(!lastPage && currentPage < maxPageSize){ StringBuilder request = new Strin
我的应用程序使用 Apache HTTPClient 4.3.5 发送 HTTP 请求并获得响应。 我想弄清楚应用程序收到了什么响应。 以下是日志片段- [Jan 04 2015 05:38:14.1
如何从 HttpClient 类型的现有对象获取 cookie? 我正在使用 HttpClient 版本 4.3.3,它不再有方法 httpClient.getCookieStore() 了。 最佳答
我是一名优秀的程序员,十分优秀!