Il se trouve que vous ne voulez pas faire glisser un client HTTP puissant et lourd dans un projet, mais que vous voulez prendre quelque chose de léger, mais sa fonctionnalité ne suffit pas. Pour faire face à ces compromis, j'ai de petites classes de décorateurs que j'ai publiées publiquement sous la licence MIT.
Changement de version du protocole
HTTP / 2 nous est parvenu, mais tous les serveurs, ainsi que tous les clients, ne le prennent pas en charge. Si vous essayez d'envoyer une demande en forçant la version 2 du protocole, vous pouvez recevoir une erreur du serveur 505 HTTP Version Not Supported
. Le package webclient / ext-protocol-version résout ce problème éventuellement artificiel. Lors de la réception d'une réponse 505, le client répétera la demande, mais avec la version de protocole spécifiée dans la réponse du serveur.
<?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);
Redirige
C'est très rare, mais cela se produit lorsque le client ne sait pas comment suivre les redirections lorsqu'il répond avec du code 3xx
. Dans ce cas, le package webclient / ext-redirect vous aidera . Tout est élémentaire ici, on passe notre client et le nombre maximum de redirections autorisées par requête au constructeur.
<?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);
Enregistrement
. 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
, - . !