Cliente HTTP con esteroides

Sucede que no desea arrastrar un cliente HTTP potente y pesado a un proyecto, pero desea tomar algo ligero, pero su funcionalidad no es suficiente. Para lidiar con estas compensaciones, tengo pequeñas clases de decoradores que he publicado públicamente bajo la licencia del MIT.

Cambiar la versión del protocolo

HTTP / 2 llegó a nosotros, pero no todos los servidores, ni tampoco todos los clientes, lo admiten. Si intenta enviar una solicitud forzando la versión 2 del protocolo, puede recibir un error del servidor 505 HTTP Version Not Supported. El paquete webclient / ext-protocol-version resuelve este problema posiblemente artificial. Al recibir una respuesta 505, el cliente repetirá la solicitud, pero con la versión del protocolo especificada en la respuesta del servidor.

<?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);

Redireccionamientos

Es muy raro, pero ocurre cuando el cliente no sabe cómo seguir las redirecciones cuando responde con código 3xx. En este caso, el paquete webclient / ext-redirect ayudará . Todo es elemental aquí, pasamos nuestro cliente y el número máximo de redireccionamientos permitidos por solicitud al constructor.

<?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);

Inicio sesión

. 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