当前位置: 首页 > 文档资料 > Swoole 中文文档 >

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查询】
      • 默认值:无
      • 其它值:无
    • 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()

向服务器发送请求,底层会自动建立一个Http2stream。可以同时发起多个请求。

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 字符串,设置请求方法,如GETPOST
      • 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
当发送endtrue的数据帧之后,流将关闭,之后不能再调用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;