ikwattro / guzzle-stereo
Guzzle Recorder 用于记录请求/响应并在模拟中回放
Requires
- php: >=5.6
- guzzlehttp/guzzle: ^6.0
- symfony/config: ^2.7 || ^3.1
- symfony/finder: ^2.7 || ^3.1
- symfony/yaml: ^2.7 || ^3.1
Requires (Dev)
- phpspec/phpspec: ^2.2
- phpunit/phpunit: ^4.7
This package is not auto-updated.
Last update: 2024-09-10 04:01:03 UTC
README
轻松记录和回放 HTTP 响应。
需求
- PHP 5.6+
- Guzzle 6
安装
需要 composer 包
composer require ikwattro/guzzle-stereo
注意:如果你使用 Symfony 框架,可以查看 @estahn 的GuzzleStereoBundle。
基础
录制器
录制器是了解磁带及其存储方式的主要对象。
磁带
磁带将记录 Response
对象。它有一个名称,可以具有 filters
。一个过滤器可以告诉例如,只有状态码为 200 的响应将被记录在该磁带上。
定义磁带和过滤器是通过一个 yaml
文件定义完成的
tapes: my_tape: filters: status_code: 200
这个磁带将只记录成功响应。
过滤器
过滤器是一个 rule
,告诉是否包含 Response
对象。库中提供了一些内置的过滤器,你也可以创建自己的并注册它们。
注意:如果你觉得你的过滤器足够通用,不要犹豫,直接提交一个 PullRequest
存储目录
为了稍后回放(见下面的回放部分),所有磁带都将随后以 json 文件的形式写入磁盘。你需要提供一个可写目录。
播放器
播放器可以将导出的 json 文件作为 Response
对象回放。一个很好的用例是在你的测试套件中使用 Mock Handler
回放它们。
用法
录制
通过提供可写存储目录和你的磁带定义文件的位置来实例化录制器
require_once(__DIR__.'/vendor/autoload.php'); use Ikwattro\GuzzleStereo\Recorder; $recorder = new Recorder(__DIR__.'/var/records', __DIR__.'/stereo.yml');
接下来,当创建你的 Guzzle 客户端时,你需要让它知道录制器。一个简单的方法是使用库中可用的中间件
$stack = \GuzzleHttp\HandlerStack::create(); $stack->push(\Ikwattro\GuzzleStereo\RecorderMiddleware::record($recorder)); $client = new \GuzzleHttp\Client(['handler' => $stack]);
现在你可以像往常一样使用客户端进行 http 请求,例如,这里我们将调用 GitHub 事件 API 10 次
for ($i = 0; $i < 10; $i++) { try { $client->get('https://api.github.com/events'); } catch (RequestException $e) { // Do what you want } }
最后,你需要告诉录制器将磁带转储到磁盘
$recorder->dump();
在提供的存储目录中创建一个名为 record_ + {tape_name}
的文件,包含通过过滤器的响应
回放
为了回放记录的磁带,你可以使用 Player
。实际上,播放器创建了一个 Mock Handler,并返回一个包含磁带文件中响应的 GuzzleHttp\Client
实例。
use Ikwattro\GuzzleStereo\Player; $player = Player::replayFromTape('/path/to/tape.json'); $player->get('/'); // will return you the first response record present in the tape
过滤器参考
StatusCode
仅当响应具有相应的状态码时才包含响应。
tapes: my_tape: filters: status_code: 200
非空体
仅当体不为空时才包含响应。
tapes: my_tape: filters: non_empty_body: ~
有头
仅当包含指定键的头时才包含响应。
tapes: my_tape: filters: has_header: "Content-Type"
创建自己的过滤器
创建一个过滤器非常简单。你需要创建一个实现 Ikwattro\GuzzleStereo\Filter\FilterInterface
的过滤器类,并声明两个方法
public static function getName()
public function isIncluded(ResponseInterface $response)
getName
静态函数负责定义磁带中的过滤器名称。
isIncluded
函数将包含确定接收到的 Response
是否应包含在磁带中的逻辑。
以下示例过滤器将接收来自Github事件API的响应,并且只有当正文包含由您在将过滤器关联到磁带时作为参数传递的Github用户执行的事件时,才会记录它。
<?php namespace Acme\MyApp\Filter; use Ikwattro\GuzzleStereo\Filter\FilterInterface; use Psr\Http\Message\ResponseInterface; class ActorFilter implements FilterInterface { const FILTER_NAME = "actor_filter"; protected $users; public function__construct(array $users = array()) { $this->users = $users; } public static function getName() { return self::FILTER_NAME; } public function isIncluded(ResponseInterface $response) { $body = json_decode((string) $response->getBody()); foreach ($body as $event) { $actor = $event['actor']['login']; if (in_array($actor, $this->users)) { return true; } } return false; } }
您现在可以在配置中添加自定义过滤器,并在磁带中使用它。
custom_filters: - "Acme\MyApp\Filter\ActorFilter" - tapes: my_tape: filters: actor_filter: ["jexp","ikwattro","luanne"]
您的磁带现在将只包含包含提供的演员之一作为其演员之一的响应。
额外配置设置
您可以通过设置以下配置标志使您的响应对象包含特定头作为标记
marker_header: true
这将添加一个具有true
值的X-Guzzle-Stereo
头。
待办事项
- 更多过滤器
- 黑名单
- 空磁带
- 更好的配置管理(可能是Symfony配置组件)
- 组合requestAndResponses
- 过滤播放器应返回的内容
- 你的想法?
测试
使用phpspec
和phpunit
进行测试
./vendor/bin/phpspec run -f pretty ./vendor/bin/phpunit
许可
该库采用MIT许可发布,请参阅随软件包提供的LICENSE文件。
贡献
请随意在Github上贡献或报告问题。
作者
Christophe Willemsen
Twitter: @ikwattro
Github: @ikwattro