PSR-7: interfaz de mensajes HTTP en PHP 7

El protocolo HTTP existe desde hace bastante tiempo. Su desarrollo fue iniciado por Tim Berners-Lee en el CERN en 1989. A lo largo de los años, Internet Engineering Task Force (IETF) y el World Wide Web Consortium (W3C) definieron una serie de estándares para él, conocidos como solicitudes de comentarios (RFC) ) La primera definición de HTTP / 1.1 ocurrió en RFC 2068 en 1997, y luego fue desaprobada por RFC 2616 en 1999.
Más de una década después, HTTP/2 se estandarizó en 2015. Aunque HTTP/2 ahora es compatible con los principales servidores web, HTTP/1.1 todavía se usa ampliamente.

La comunicación HTTP subyacente se reduce a solicitudes y respuestas, comúnmente conocidas como mensajes HTTP. Alejados de los consumidores promedio, estos mensajes forman la base del desarrollo web y, por lo tanto, son de interés para cada desarrollador web de aplicaciones. Mientras que RFC 7230, RFC 7231 y RFC 3986 especifican los detalles del propio HTTP, PSR-7 describe interfaces comunes para representar los mensajes HTTP de acuerdo con estos RFC.

PSR-7 define un total de las siguientes siete interfaces:

  • Psr\Http\Message\MessageInterface
  • Psr\Http\Message\RequestInterface
  • Psr\Http\Message\ServerRequestInterface
  • Psr\Http\Message\ResponseInterface
  • Psr\Http\Message\StreamInterface
  • Psr\Http\Message\UriInterface
  • Psr\Http\Message\UploadedFileInterface

Se pueden obtener a través de Composer como parte del paquete psr/http-message.
El siguiente bloque de código refleja la definición PSR-7 Psr\Http\Message\MessageInterface:

<?php
namespace Psr\Http\Message;
interface MessageInterface
{
public function getProtocolVersion();
public function withProtocolVersion($version);
public function getHeaders();
public function hasHeader($name);
public function getHeader($name);
public function getHeaderLine($name);
public function withHeader($name, $value);
public function withAddedHeader($name, $value);
public function withoutHeader($name);
public function getBody();
public function withBody(StreamInterface $body);
}

Los métodos anteriores de MessageInterface son comunes al tipo de mensaje de solicitud y respuesta. Los mensajes se consideran inmutables. Una clase que implementa la interfaz MessageInterface necesita asegurar esta inmutabilidad devolviendo una nueva instancia de mensaje para cada llamada a un método que cambie el estado del mensaje.

El siguiente bloque de código refleja la definición PSR-7 Psr\Http\Message\RequestInterface:

<?php
namespace Psr\Http\Message;
interface RequestInterface extends MessageInterface
{
public function getRequestTarget();
public function withRequestTarget($requestTarget);
public function getMethod();
public function withMethod($method);
public function getUri();
public function withUri(UriInterface $uri, $preserveHost = false);
}

La interfaz RequestInterface extiende MessageInterface que sirve como una representación de una solicitud saliente del lado del cliente. Al igual que los mensajes mencionados anteriormente, las solicitudes también se consideran inmutables. Esto significa que se aplica el mismo comportamiento de clase. Si el método de clase es para cambiar el estado de la solicitud, la nueva instancia de solicitud debe devolverse para cada llamada de método.
La siguiente definición de Psr\Http\Message\ServerRequestInterface refleja el estándar PSR-7:

<?php
namespace Psr\Http\Message;
interface ServerRequestInterface extends RequestInterface
{
public function getServerParams();
public function getCookieParams();
public function withCookieParams(array $cookies);
public function getQueryParams();
public function withQueryParams(array $query);
public function getUploadedFiles();
public function withUploadedFiles(array $uploadedFiles);
public function getParsedBody();
public function withParsedBody($data);
public function getAttributes();
public function getAttribute($name, $default = null);
public function withAttribute($name, $value);
public function withoutAttribute($name);
}

Las implementaciones de ServerRequestInterface sirven como una representación de una solicitud HTTP entrante del lado del servidor. Ellos también se consideran inmutables; esto significa que las mismas reglas de métodos de cambio de estado se aplican como se mencionó anteriormente.
El siguiente fragmento de código refleja la definición de PSR-7 Psr\Http\Message\ResponseInterface:

<?php
namespace Psr\Http\Message;
interface ResponseInterface extends MessageInterface
{
public function getStatusCode();
public function withStatus($code, $reasonPhrase = '');
public function getReasonPhrase();
}

Con solo tres métodos definidos, las implementaciones de ResponseInterface sirven como una representación de una respuesta saliente del lado del servidor. Este tipo de mensajes también se consideran inmutables.
El siguiente fragmento de código refleja la definición PSR-7 Psr\Http\Message\StreamInterface:

<?php
namespace Psr\Http\Message;
interface StreamInterface
{
public function __toString();
public function close();
public function detach();
public function getSize();
public function tell();
public function eof();
public function isSeekable();
public function seek($offset, $whence = SEEK_SET);
public function rewind();
public function isWritable();
public function write($string);
public function isReadable();
public function read($length);
public function getContents();
public function getMetadata($key = null);
}

StreamInterface proporciona un contenedor alrededor de la secuencia de operaciones común de PHP, incluída la serialización de toda la secuencia a una cadena.
El siguiente fragmento de código refleja la definición de PSR-7 Psr\Http\Message\UriInterface:

<?php
namespace Psr\Http\Message;
interface UriInterface
{
public function getScheme();
public function getAuthority();
public function getUserInfo();
public function getHost();
public function getPort();
public function getPath();
public function getQuery();
public function getFragment();
public function withScheme($scheme);
public function withUserInfo($user, $password = null);
public function withHost($host);
public function withPort($port);
public function withPath($path);
public function withQuery($query);
public function withFragment($fragment);
public function __toString();
}

La interfaz UriInterface aquí representa los URI de acuerdo con RFC 3986. Los métodos de interfaz obligan al implementador a proporcionar métodos para las operaciones más comunes alrededor del objeto URI. Las instancias de objetos URI también se consideran inmutables.
El siguiente fragmento de código refleja la definición de PSR-7 Psr \ Http \ Message \ UploadedFileInterface:

<?php
namespace Psr\Http\Message;
interface UploadedFileInterface
{
public function getStream();
public function moveTo($targetPath);
public function getSize();
public function getError();
public function getClientFilename();
public function getClientMediaType();
}

La interfaz UploadedFileInterface representa un archivo cargado a través de una solicitud HTTP, que es una función frecuente de las aplicaciones web. El puñado de métodos obliga a la implementación de la clase a cubrir las acciones más comunes realizadas en los archivos. Al igual que con todas las interfaces anteriores, la implementación de la clase debe garantizar la inmutabilidad del objeto.

Guzzle es una biblioteca popular de cliente HTTP compatible con PSR-7 que facilita el trabajo con solicitudes, respuestas y transmisiones. Está disponible en https://github.com/guzzle/guzzle, o como paquete Composer guzzlehttp/guzzle.
La guía oficial de PSR-7: Interfaz de mensajes HTTP está disponible en http://www.php-fig.org/psr/psr-7/.

Comparte