类固醇上的HTTP客户端

碰巧您不想将功能强大且笨重的HTTP客户端拖到项目中,但是想轻描淡写,但其功能还不够。为了解决这些折衷,我有一些小型装饰器类,这些类是根据MIT许可公开发布的。

协议版本变更

HTTP / 2来到了我们,但并非每个服务器以及每个客户端都支持它。如果尝试通过强制使用协议版本2来发送请求,则可能会收到来自服务器的错误505 HTTP Version Not Supportedwebclient / ext-protocol-version软件包解决了这个可能存在的问题。收到505响应后,客户端将重复该请求,但服务器响应中指定了协议版本。

<?php

use Webclient\Extension\ProtocolVersion\Client;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;

/** 
 * @var ClientInterface $client  PSR-18  HTTP Client.
 */
$http = new Client($client);

/** @var RequestInterface $request */
$response = $http->sendRequest($request);

重新导向

这是非常罕见的,但是当客户端在响应code时不知道如何遵循重定向时,就会发生这种情况3xx在这种情况下,webclient / ext-redirect软件包会有所帮助这里的一切都很基本,我们将客户端和每个请求允许的最大重定向数传递给构造函数。

<?php

use Webclient\Extension\Redirect\Client;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;

/** 
 * @var ClientInterface $client  PSR-18  HTTP Client.
 * @var int $maxRedirects    .
 */
$http = new Client($client, $maxRedirects);

/** @var RequestInterface $request */
$response = $http->sendRequest($request);

记录中

. webclient/ext-log , . , PSR-3 . Webclient\Extension\Log\Formatter\Formatter, ID ( -) - Webclient\Extension\Log\IdGenerator\IdGenerator. :

  • Webclient\Extension\Log\IdGenerator\UniqueIdGenerator - uniqid()

  • Webclient\Extension\Log\Formatter\RawHttpFormatter - RAW-.

<?php

use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
use Webclient\Extension\Log\Client;
use Webclient\Extension\Log\Formatter\Formatter;
use Webclient\Extension\Log\IdGenerator\IdGenerator;

/** 
 * @var ClientInterface $client  PSR-18  HTTP Client.
 * @var LoggerInterface $logger  PSR-3  .
 * @var IdGenerator|null $idGenerator  ID-.
 *        null   
 *      Webclient\Extension\Log\IdGenerator\UniqueIdGenerator.
 * @var Formatter|null $formatter   . 
 *        null   
 *      Webclient\Extension\Log\Formatter\RawHttpFormatter.
 */
$http = new Client(
    $client,
    $logger,
    $idGenerator,
    $formatter,
    LogLevel::INFO, //   
    LogLevel::INFO, //     ( 1xx)
    LogLevel::INFO, //     ( 2xx)
    LogLevel::INFO, //      ( 3xx)
    LogLevel::ERROR, //       ( 4xx)
    LogLevel::ERROR, //       ( 5xx)
    LogLevel::WARNING //    HTTP 
);

/** @var RequestInterface $request */
$response = $http->sendRequest($request);

, . ( -). , Webclient\Extension\Cookie\Cookie\Storage webclient/ext-cookie, :

  • Webclient\Extension\Cookie\Cookie\ArrayStorage - . ;

  • Webclient\Extension\Cookie\Cookie\NetscapeCookieFile - Netscape.

<?php

use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Webclient\Extension\Cookie\Client;
use Webclient\Extension\Cookie\Cookie\Storage;

/** 
 * @var ClientInterface $client  PSR-18  HTTP Client.
 * @var Storage $storage  .
 *               .
 */
$http = new Client($client, $storage);

/** @var RequestInterface $request */
$response = $http->sendRequest($request);

, . - ( ), webclient/ext-cache. , Psr\SimpleCache\CacheInterface PSR-6, Psr\Http\Message\ResponseFactoryInterface Psr\Http\Message\StreamFactoryInterface PSR-17.

HTTP- .

<?php

use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\SimpleCache\CacheInterface;
use Webclient\Extension\Cache\Client;

/** 
 * @var ClientInterface $client  PSR-18  HTTP Client.
 * @var CacheInterface $cache  PSR-6  .
 * @var ResponseFactoryInterface $responseFactory 
 *       PSR-17   .
 * @var StreamFactoryInterface $streamFactory
 *       PSR-17   .
 * @var string ,     (, ID ).
 */
$http = new Client(
  $client,
  $cache,
  $responseFactory,
  $streamFactory,
  $privateKey
);

/** @var RequestInterface $request */
$response = $http->sendRequest($request);

, . , - .

, PSR-7 - . Psr\Http\Message\RequestInterface (Psr\Http\Message\ServerRequestInterface ). , withUploadedFiles($files) HTTP-. , , . webclient/helper-form . Psr\Http\Message\ResponseFactoryInterface Psr\Http\Message\StreamFactoryInterface.

, (, API), , , .

webclient/fake-http-client, Psr\Http\Client\ClientInterface, Psr\Http\Server\RequestHandlerInterface PSR-15 ( Psr\Http\Message\RequestInterface Psr\Http\Message\ServerRequestInterface). Psr\Http\Server\RequestHandlerInterface - , .

<?php

use Webclient\Fake\Client;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

/** 
 * @var RequestHandlerInterface $handler   . 
 * @var array $serverParams  ,    
 *         Psr\Http\Message\RequestInterface 
 *      Psr\Http\Message\ServerRequestInterface.
 */
$client = new Client($handler, $serverParams);

/**
 * @var RequestInterface $request  HTTP-
 */
$response = $client->sendRequest($request);

Psr\Http\Message\ServerRequestInterface , , Webclient\Fake\Client::NOREPLACEATTRIBUTE ( ).

<?php

use Webclient\Fake\Client;
use Psr\Http\Server\RequestHandlerInterface;

/** 
 * @var Client $client. 
 * @var ServerRequestInterface $request.
 */
$request = $request->withAttribute(Client::NOREPLACEATTRIBUTE, true);
$response = $client->sendRequest($request);

- , Webclient\Fake\Handler\SimpleRoutingHandler - .

<?php

use Webclient\Fake\Client;
use Webclient\Fake\Handler\SimpleRoutingHandler;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

/** 
 * @var RequestHandlerInterface $notFoundHandler  , 
 *          .
 * @var RequestHandlerInterface $entityCreatedHandler  
 *          (POST /entities).
 * @var RequestHandlerInterface $entityHandler  
 *         (GET /entities/1).
 * @var RequestHandlerInterface $entityDeletedHandler  
 *         (DELETE /entities/2).
 * @var RequestInterface $errorRequest   URI (GET /users).
 * @var RequestInterface $entityCreatingRequest   
 *       (POST /entities).
 * @var RequestInterface $entityRequest   
 *       (GET /entities/1).
 * @var RequestInterface $entityDeletingRequest   
 *       (DELETE /entities/2).
 */

$handler = new SimpleRoutingHandler($notFoundHandler);
$handler
    ->route(['GET', 'HEAD'], '/entities/1', $entityHandler)
    ->route(['POST'], '/entities', $entityCreatedHandler)
    ->route(['DELETE'], '/entities/2', $entityDeletedHandler)
;
$client = new Client($handler);

$resp1 = $client->sendRequest($errorRequest); //   404
$resp2 = $client->sendRequest($entityCreatingRequest); //    201
$resp3 = $client->sendRequest($entityRequest); //     200
$resp4 = $client->sendRequest($entityDeletingRequest); //     204

, - . !




All Articles