Request
As rotas e o middleware da aplicação recebem um objeto Request da PSR 7 que representa a solicitação HTTP atual recebida pelo seu servidor web. O objeto de solicitação implementa o PSR 7 ServerRequestInterface com o qual você pode inspecionar e manipular o método de solicitação HTTP, header e body.
Como obter o objeto Request
O objeto Request PSR 7 pode ser injetado automaticamente pelo Container de depêndencias em suas rotas como argumento do callback ou nos métodos do seu controller, exemplo:
// src/App/config/routes.php
use Psr\Http\Message\ServerRequestInterface as Request;
$app->get('/foo', function (Request $request) {
$data = $request->getParsedBody()->getAll();
});
// src/App/Controllers/DefaultController.php
<?php
namespace App\Controllers;
use Gangoy\Core\Http\Controller\AbastractController;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
class DefaultController extends AbastractController
{
public function index(Request $request, Response $response, $args)
{
$data = $request->getParsedBody()->getAll();
return $this->json($response, $data);
}
}
O objeto Request PSR 7 também é injetado automaticamente pelo Container de depêndencias nos middlewares como o primeiro argumento. Veja nosso exemplo de implementação:
~~~php
// src/App/Middlewares/MyMiddleware.php
<?php
namespace App\Middlewares;
use Gangoy\Core\Http\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
class MyMiddleware implements MiddlewareInterface
{
/**
* @param Request $request PSR7 request
* @param Response $response PSR7 response
* @param callable $next Next middleware
*
* @return mixed
*/
public function __invoke(Request $request, Response $response, callable $next)
{
//
return $next($request, $response);
}
}
~~~
Métodos
Toda solicitação HTTP possui um método que normalmente é um dos abaixo:
- GET
- POST
- PUT
- DELETE
- HEAD
- PATCH
- OPTIONS
Você pode obter o método da requisição HTTP fazendo o seguinte:
$method = $request->getMethod();
A implementação do PSR 7 também fornece esses métodos que retornam true ou false.
- $request->isGet()
- $request->isPost()
- $request->isPut()
- $request->isDelete()
- $request->isHead()
- $request->isPatch()
- $request->isOptions()
É possível substituir o método de solicitação HTTP. Isso é útil se, por exemplo, você precisa enviar uma requisição do tipo PUT usando um navegador da web tradicional que só suporta GET ou POST. Veja o exemplo:
<form method="POST" action="">
<input type="hidden" name="_METHOD" value="PUT">
</form>
Você pode buscar o método HTTP original (não anulado) com o método do objeto PSR 7 Request getOriginalMethod().
URI
Toda solicitação HTTP possui um URI que identifica a rota solicitada ao aplicativo. O URI tem várias partes:
- Scheme (http or https)
- Host (example.com)
- Port (80 or 443)
- Path (/users/1)
- Query string (sort=created&dir=asc)
Você pode capturar o objeto URI do objeto Request PSR 7 da seguinte forma:
$uri = $request->getUri();
O objeto URI é em sí um objeto que fornece os seguintes métodos para inspecionar as partes de uma URL HTTP:
- getScheme()
- getAuthority()
- getUserInfo()
- getHost()
- getPort()
- getPath()
- getBasePath()
- getQuery() (Retorna a string de consulta completa, por exemplo a=1&b=2)
- getFragment()
- getBaseUrl()
Você pode obter os parâmetros da consulta como uma matriz associativa no objeto Request usando getQueryParams()
.
Você também pode obter um único valor de parâmetro usando getQueryParam($key)
.
Headers
Toda solicitação HTTP possui cabeçalhos. Estes são metadados que descrevem a solicitação HTTP, mas não estão visíveis no corpo da solicitação. O objeto Request PSR 7 fornece diversos métodos para inspecionar seus cabeçalhos.
Você pode obter todos os cabeçalhos de solicitação HTTP como uma matriz associativa usando o método getHeaders()
.
As chaves da matriz associativa resultante são os nomes de cabeçalho e seus valores
$headers = $request->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
Você pode obter os valores de um único cabeçalho. Isso retorna uma matriz de valores para o nome do cabeçalho dado. Lembre-se, um único cabeçalho HTTP pode ter mais de um valor!
$headerValueArray = $request->getHeader('Accept');
Você pode testar a presença de um cabeçalho com o hasHeader($name).
if ($request->hasHeader('Accept')) {
// Do something
}
Body
Toda solicitação HTTP possui um corpo (Body). Se você está criando um aplicativo que consome dados JSON ou XML, você pode usar o método getParsedBody() do objeto Request PSR 7 para analisar o corpo de solicitação HTTP em um formato PHP nativo. Gangoy pode analisar dados JSON, XML e URL-enconded.
$parsedBody = $request->getParsedBody();
- Request JSON são convertidos em matrizes com json_decode($input, true).
- Request XML são convertidos em um SimpleXMLElement com simplexml_load_string($input).
- Request URL-enconded são convertidos em uma matriz PHP com parse_str($input).
Para Request URL-encoded, você também pode obter o valor de parâmetro único, com valor padrão opcional se o parâmetro
estiver faltando usando o método getParsedBodyParam($key, $default = null)
.
Tecnicamente falando, o objeto Request PSR 7 da aplicação Gangoy, representa o corpo de solicitação HTTP como uma instância
de \Psr\Http\Message\StreamInterface. Você pode obter a instância StreamInterface do Body HTTP com o método getBody()
do objeto Request do PSR 7 . O método getBody() é preferível se o tamanho da solicitação HTTP recebida for desconhecido
ou muito grande para a memória disponível.
$body = $request->getBody();
Uploaded Files
Os carregamentos de arquivos $_FILES estão disponíveis a partir do método getUploadedFiles()
do objeto Request . Isso
retorna uma matriz pelo nome do elemento <input>
.
$files = $request->getUploadedFiles();
Cada objeto na matriz em $files é uma instância \Psr\Http\Message\UploadedFileInterface e é compatível com os seguintes métodos:
- getStream()
- moveTo($targetPath)
- getSize()
- getError()
- getClientFilename()
- getClientMediaType()
Veja como fazer upload de arquivos.
Content Type
Você pode buscar o Content Type com o método getContentType()
. Isso retorna o valor do Content-Type do cabeçalho fornecido pelo cliente HTTP.
$contentType = $request->getContentType();
Media Type
Você pode não querer o Content-Type completo . E se, em vez disso, você quer apenas o tipo de mídia? Você pode
buscar o tipo de mídia com o método getMediaType()
.
$mediaType = $request->getMediaType();
Character Set
Para recuperar o Charset de um Request use:
$charset = $request->getContentCharset();
Content Length
Para recuperar o tamanho de um Request use:
$length = $request->getContentLength();