react / http-client
Requires
- php: >=5.3.0
- evenement/evenement: ^3.0 || ^2.0 || ^1.0
- react/event-loop: ^1.0 || ^0.5 || ^0.4 || ^0.3
- react/promise: ^2.1 || ^1.2.1
- react/socket: ^1.0 || ^0.8.4
- react/stream: ^1.0 || ^0.7.1
- ringcentral/psr7: ^1.2
Requires (Dev)
- clue/block-react: ^1.2
- phpunit/phpunit: ^7.0 || ^6.4 || ^5.7 || ^4.8.35
- react/promise-stream: ^1.1
This package is auto-updated.
Last update: 2021-04-07 16:52:49 UTC
README
此包已迁移至 react/http,仅存在为向后兼容原因。
$ composer require react/http
如果您之前使用过此包,升级可能需要片刻时间。新的 API 已更新为使用 Promises 和 PSR-7 消息抽象。这意味着它现在比以往任何时候都更强大且易于使用。
// old $client = new React\HttpClient\Client($loop); $request = $client->request('GET', 'https://example.com/'); $request->on('response', function ($response) { $response->on('data', function ($chunk) { echo $chunk; }); }); $request->end(); // new $browser = new React\Http\Browser($loop); $browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) { echo $response->getBody(); });
有关更多详细信息,请参阅 react/http。
以下文档适用于此包的最后一个版本。进一步的开发将在更新的 react/http 中进行,因此强烈建议您尽快升级。
已弃用的 HttpClient
ReactPHP 的基于事件的流式 HTTP 客户端。
目录
基本用法
客户端
Client
负责与 HTTP 服务器通信,管理连接状态并发送您的 HTTP 请求。它还将所有内容注册到主要的 EventLoop
。
$loop = React\EventLoop\Factory::create(); $client = new Client($loop);
如果您需要自定义连接器设置(DNS 解析、TLS 参数、超时、代理服务器等),您可以显式传递一个自定义的 ConnectorInterface
实例。
$connector = new \React\Socket\Connector($loop, array( 'dns' => '127.0.0.1', 'tcp' => array( 'bindto' => '192.168.10.1:0' ), 'tls' => array( 'verify_peer' => false, 'verify_peer_name' => false ) )); $client = new Client($loop, $connector);
可以使用 request(string $method, string $uri, array $headers = array(), string $version = '1.0'): Request
方法准备新的 Request 对象。
可选的 $headers
参数可以用于传递额外的请求头。您可以使用关联数组(键=值)或数组(每个头值=键)来传递。如果适用,请求将自动包含适当的 Host
、User-Agent: react/alpha
和 Connection: close
头。您可以传递自定义头值或使用空数组来省略任何这些。
可以使用 Request#write(string $data)
方法将数据写入请求体。数据将被缓冲,直到底层连接建立,此时缓冲的数据将被发送,所有进一步的数据将立即传递到底层连接。
Request#end(?string $data = null)
方法可以用来完成请求的发送。您可以可选地传递一个最后的请求体数据块,就像 write()
调用一样发送。调用此方法将最终确定出站请求体(可能为空)。数据将被缓冲,直到底层连接建立,此时将发送缓冲数据,并忽略所有后续数据。
Request#close()
方法可以用来强制关闭请求的发送。与 end()
方法不同,此方法会丢弃任何缓冲区,并在连接已建立的情况下关闭底层连接,否则取消挂起的连接尝试。
请求实现了 WritableStreamInterface 接口,因此可以将流管道连接到它。请求发出的有趣事件
response
:已从服务器接收到响应头,并成功解析。第一个参数是一个响应实例。drain
:出站缓冲区已清空,响应已准备好接受下一次write()
调用的更多数据。error
:发生了错误,第一个参数是Exception
。如果响应发出error
事件,此事件也会在这里发出。close
:请求已关闭。如果发生错误,此事件将先于error
事件发出。对于成功的响应,只有在响应发出close
事件后才会发出此事件。
响应实现了 ReadableStreamInterface 接口。响应发出的有趣事件
data
:将响应体的数据块作为第一个参数传递。当响应遇到分块编码的响应时,它将自动解析它,并为用户移除Transfer-Encoding
头部。error
:发生了错误,第一个参数是Exception
。这也会被转发到请求,并发出那里的error
事件。end
:已完全接收到响应。close
:响应已关闭。如果发生错误,此事件将先于error
事件发出。这也会被转发到请求,并发出那里的close
事件。
示例
<?php $loop = React\EventLoop\Factory::create(); $client = new React\HttpClient\Client($loop); $request = $client->request('GET', 'https://github.com/'); $request->on('response', function ($response) { $response->on('data', function ($chunk) { echo $chunk; }); $response->on('end', function() { echo 'DONE'; }); }); $request->on('error', function (\Exception $e) { echo $e; }); $request->end(); $loop->run();
请参阅 示例。
高级用法
Unix 域套接字
默认情况下,此库支持通过明文 TCP/IP 和安全 TLS 连接在 http://
和 https://
URI 方案中传输。此库还支持在明确配置的情况下使用 Unix 域套接字(UDS)。
为了使用 UDS 路径,您必须明确配置连接器以覆盖目标 URI,这样请求 URI 中给出的主机名将不再用于建立连接。
$connector = new FixedUriConnector( 'unix:///var/run/docker.sock', new UnixConnector($loop) ); $client = new Client($loop, $connector); $request = $client->request('GET', 'http://localhost/info');
请参阅 示例 #11。
安装
安装此库的推荐方法是 通过 Composer。 对 Composer 不熟悉?
这将安装最新支持的版本
$ composer require react/http-client:^0.5.10
请参阅 变更日志 了解有关版本升级的详细信息。
此项目旨在在所有平台上运行,因此不需要任何 PHP 扩展,并支持在旧版 PHP 5.3 到当前 PHP 7+ 和 HHVM 上运行。强烈建议为此项目使用 PHP 7+。
测试
要运行测试套件,首先需要克隆此仓库,然后通过Composer安装所有依赖项(请访问Composer网站)
$ composer install
要运行测试套件,请进入项目根目录并运行
$ php vendor/bin/phpunit
测试套件还包含一些功能集成测试,这些测试会向在线服务http://httpbin.org发送测试HTTP请求,因此依赖于稳定的互联网连接。如果您不想运行这些测试,可以像这样简单地跳过
$ php vendor/bin/phpunit --exclude-group internet
许可证
MIT许可证,请参阅LICENSE文件。