Coroutine\Http2\Client
优质
小牛编辑
135浏览
2023-12-01
协程Http2客户端
使用示例
Co\run(function () {
$domain = 'www.zhihu.com';
$cli = new Swoole\Coroutine\Http2\Client($domain, 443, true);
$cli->set([
'timeout' => -1,
'ssl_host_name' => $domain
]);
$cli->connect();
$req = new Swoole\Http2\Request();
$req->method = 'POST';
$req->path = '/api/v4/answers/300000000/voters';
$req->headers = [
'host' => $domain,
'user-agent' => 'Chrome/49.0.2587.3',
'accept' => 'text/html,application/xhtml+xml,application/xml',
'accept-encoding' => 'gzip'
];
$req->data = '{"type":"up"}';
$cli->send($req);
$response = $cli->recv();
var_dump(assert(json_decode($response->data)->error->code === 602));
});
方法
__construct()
构造方法。
Swoole\Coroutine\Http2\Client->__construct(string $host, int $port, bool $ssl = false): void;
参数
string $host
- 功能:目标主机的IP地址【
$host
如果为域名底层需要进行一次DNS
查询】 - 默认值:无
- 其它值:无
- 功能:目标主机的IP地址【
int $port
- 功能: 目标端口【
Http
一般为80
端口,Https
一般为443
端口】 - 默认值:无
- 其它值:无
- 功能: 目标端口【
bool $ssl
- 功能: 是否开启
TLS/SSL
隧道加密 【https
网站必须设置为true
】 - 默认值:
false
- 其它值:
true
- 功能: 是否开启
注意
!> -如果你需要请求外网URL请修改
timeout
为更大的数值,参考客户端超时规则
-$ssl
需要依赖openssl
,必须在编译Swoole
时启用--enable-openssl
set()
设置客户端参数,其它详细配置项请参考 Swoole\Client::set 配置选项
Swoole\Coroutine\Http2\Client->set(array $options): void;
connect()
连接到目标服务器。此方法没有任何参数。
!> 发起connect
后,底层会自动进行协程调度,当连接成功或失败时connect
会返回。连接建立后可以调用send
方法向服务器发送请求。
Swoole\Coroutine\Http2\Client->connect(): bool;
返回值
- 连接成功,返回
true
- 连接失败,返回
false
,请检查errCode
属性获取错误码
- 连接成功,返回
send()
向服务器发送请求,底层会自动建立一个Http2
的stream
。可以同时发起多个请求。
Swoole\Coroutine\Http2\Client->send(swoole_http2_request $request): int|false;
参数
swoole_http2_request $request
- 功能:发送 swoole_http2_request 对象
- 默认值:无
- 其它值:无
返回值
- 成功返回流的编号,编号为从
1
开始自增的奇数 - 失败返回
false
- 成功返回流的编号,编号为从
提示
Request对象
!>
swoole_http2_request
对象没有任何方法,通过设置对象属性来写入请求相关的信息。headers
数组,HTTP
头method
字符串,设置请求方法,如GET
、POST
path
字符串,设置URL
路径,如/index.php?a=1&b=2
,必须以/作为开始cookies
数组,设置COOKIES
data
设置请求的body
,如果为字符串时将直接作为RAW form-data
进行发送data
为数组时,底层自动会打包为x-www-form-urlencoded
格式的POST
内容,并设置Content-Type为application/x-www-form-urlencoded
pipeline
布尔型,如果设置为true
,发送完$request
后,不关闭stream
,可以继续写入数据内容
pipeline
- 默认
send
方法在发送请求之后,会结束当前的Http2 Stream
,启用pipeline
后,底层会保持stream
流,可以多次调用write
方法,向服务器发送数据帧,请参考write
方法。
- 默认
write()
向服务器发送更多数据帧,可以多次调用write向同一个stream写入数据帧。
Swoole\Coroutine\Http2\Client->write(int $streamId, mixed $data, bool $end = false): bool;
参数
int $streamId
- 功能: 流编号,由
send
方法返回 - 默认值:无
- 其它值:无
- 功能: 流编号,由
mixed $data
- 功能: 数据帧的内容,可以为字符串或数组
- 默认值:无
- 其它值:无
bool $end
- 功能: 是否关闭流
- 默认值:
false
- 其它值:
true
使用示例
Co\run(function (){
$cli = new Swoole\Coroutine\Http2\Client('127.0.0.1', 9518);
$cli->set(['timeout' => 1]);
var_dump($cli->connect());
$req3 = new Swoole\Http2\Request;
$req3->path = "/index.php";
$req3->headers = [
'host' => "localhost",
"user-agent" => 'Chrome/49.0.2587.3',
'accept' => 'text/html,application/xhtml+xml,application/xml',
'accept-encoding' => 'gzip',
];
$req3->pipeline = true;
$req3->method = "POST";
$streamId = $cli->send($req3);
$cli->write($streamId, ['int' => rand(1000, 9999)]);
$cli->write($streamId, ['int' => rand(1000, 9999)]);
//end stream
$cli->write($streamId, ['int' => rand(1000, 9999), 'end' => true], true);
var_dump($cli->recv());
$cli->close();
});
!> 如果要使用write
分段发送数据帧,必须在send
请求时将$request->pipeline
设置为true
当发送end
为true
的数据帧之后,流将关闭,之后不能再调用write
向此stream
发送数据。
recv()
接收请求。
!> 调用此方法时会产生协程调度
Swoole\Coroutine\Http2\Client->recv(float $timeout): Swoole\Http2\Response;
参数
float $timeout
- 功能:设置超时时间,参考客户端超时规则
- 值单位: 秒【支持浮点型,如
1.5
表示1s
+500ms
】 - 默认值:无
- 其它值:无
返回值
成功后返回 Swoole\Http2\Response 对象
/**@var $resp Swoole\Http2\Response */ var_dump($resp->statusCode); // 服务器发送的Http状态码,如200、502等 var_dump($resp->headers); // 服务器发送的Header信息 var_dump($resp->cookies); // 服务器设置的COOKIE信息 var_dump($resp->set_cookie_headers); // 服务器端返回的原始COOKIE信息,包括了domain和path项 var_dump($resp->body); // 服务器发送的响应包体
close()
关闭连接。
Swoole\Coroutine\Http2\Client->close(): bool;