webignition / http-history-container
用于 Guzzle 历史中间件的容器
3.0
2023-09-13 11:09 UTC
Requires
- php: ^8.2
- ext-json: *
- guzzlehttp/psr7: ^2.1
- psr/http-message: ^1.0 || ^2.0
- psr/log: ^1.1 || ^2.0 || ^3.0
Requires (Dev)
- mockery/mockery: ^1.4
- monolog/monolog: ^2
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-mockery: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpunit/phpunit: ^10.1
- squizlabs/php_codesniffer: ^3.6
- webignition/object-reflector: ^1.0
README
帮助您更轻松地测试您的 Guzzle HTTP 客户端 的操作。
用于 Guzzle 历史中间件 的容器,提供了对
- HTTP 事务集合(请求加响应)的访问
- 发出的请求
- 接收到的响应
- 请求 URL
哦,还有日志记录。当您的 Guzzle 客户端在测试中未在同一线程中执行时,这非常有用。
用法
基本用法
<?php use GuzzleHttp\Client as HttpClient; use GuzzleHttp\HandlerStack; use GuzzleHttp\Middleware; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use webignition\HttpHistoryContainer\Container; $historyContainer = new Container(); $historyHandler = Middleware::history($historyContainer); $handlerStack = HandlerStack::create($historyHandler); $httpClient = new HttpClient(['handler' => $handlerStack]); /// ... things happen ... $historyContainer->getTransactions(); // an array of HttpTransaction $historyContainer->getRequests(); // a Collection\RequestCollection $historyContainer->getResponses(); // a Collection\ResponseCollection foreach ($historyContainer as $transaction) { // $transaction is a HttpTransaction $request = $transaction->getRequest(); // $request is a RequestInterface $response = $transaction->getResponse(); // $response is a ResponseInterface }
发送请求的详细信息
<?php use webignition\HttpHistoryContainer\Container; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; $historyContainer = new Container(); // ... create and use Guzzle client ... $transactions = $historyContainer->getTransactions(); // $transactions is a Collection\TransactionCollection $requests = $transactions->getRequests(); // $requests is a Collection\RequestCollection // RequestCollection is iterable foreach ($requests as $request) { // $request is a RequestInterface } $urls = $requests->getUrls(); // $urls is a Collection\UrlCollection // UrlCollection is iterable foreach ($urls as $url) { // $url is a UriInterface } foreach ($urls->getAsStrings() as $urlString) { // convenient access to requested URLs as strings }
接收响应的详细信息
<?php use webignition\HttpHistoryContainer\Container; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; $historyContainer = new Container(); // ... create and use Guzzle client ... $transactions = $historyContainer->getTransactions(); // $transactions is a Collection\TransactionCollection $responses = $transactions->getResponses(); // $responses is a Collection\ResponseCollection // ResponseCollection is iterable foreach ($responses as $response) { // $response is a ResponseInterface }
日志记录!
如果测试中的客户端在测试的另一个线程中执行,您可能无法访问 Guzzle 历史记录。
一个 LoggableContainer
允许您将事务记录为它们发生时,到您喜欢的任何 Psr\Log\LoggerInterface
实例。
日志记录容器将每个 HttpTransaction
包装在 LoggableTransaction
对象中,该对象被序列化为 JSON 并输出为调试消息。
LoggableTransaction::fromJson()
允许您以某种略微有损的方式从日志消息重新创建事务对象。
日志记录示例
<?php use Monolog\Formatter\LineFormatter; use Monolog\Handler\StreamHandler; use Monolog\Logger; use webignition\HttpHistoryContainer\LoggableContainer; use webignition\HttpHistoryContainer\Transaction\LoggableTransaction; // Create the PSR logger $path = '/path/to/log'; $stream = fopen($path, 'w+'); $logger = new Logger(''); $logHandler = new StreamHandler($stream); $logHandler ->setFormatter(new LineFormatter('%message%' . "\n")); $logger->pushHandler($logHandler); // Create LoggableContainer $container = new LoggableContainer($logger); // ... create and use Guzzle client ... $logContent = file_get_contents($path); $logLines = array_filter(explode("\n", $logContent)); $loggedTransactions = []; foreach ($logLines as $logLine) { $loggedTransactions[] = LoggableTransaction::fromJson($logLine); } // $loggedTransactions is now an array of LoggableTransaction foreach ($loggedTransactions as $loggedTransaction) { $transaction = $loggedTransaction->getTransaction(); // $transaction is a HttpTransaction $request = $transaction->getRequest(); // $request is a RequestInterface $response = $transaction->getResponse(); // $response is a ResponseInterface }