# Requisições ¶

As requisições realizadas na aplicação são representadas pelo objeto yii\web\Request que fornece informações como os parâmetros da requisição, cabeçalhos HTTP, cookies e etc. Em uma determinada requisição, você pode acessar o objeto da requisição correspondente através do componente da aplicação `request`, que é uma instância de yii\web\Request, por padrão. Nesta seção, descreveremos como você pode usar este componente em sua aplicação.

## Parâmetros da Requisição ¶

Para obter os parâmetros da requisição, você pode chamar os métodos get() e post() do componente `request`. Estes métodos retornam os valores de `$_GET` e `$_POST`, respectivamente. Por exemplo,

    $request = Yii::$app->request;

    $get = $request->get();
    // equivalente à: $get = $_GET;

    $id = $request->get('id');
    // equivalente à: $id = isset($_GET['id']) ? $_GET['id'] : null;

    $id = $request->get('id', 1);
    // equivalente à: $id = isset($_GET['id']) ? $_GET['id'] : 1;

    $post = $request->post();
    // equivalente à: $post = $_POST;

    $name = $request->post('name');
    // equivalente à: $name = isset($_POST['name']) ? $_POST['name'] : null;

    $name = $request->post('name', '');
    // equivalente à: $name = isset($_POST['name']) ? $_POST['name'] : '';

> Informação: Ao invés de acessar diretamente o `$_GET` e o `$_POST` para recuperar os parâmetros da requisição, é recomendável que os utilizem através do componente `request`, como mostrado nos exemplos acima. Isto permite que você escreva testes de forma mais simples, utilizando um componente da requisição que retornem valores pré-determinados.

Ao implementar o RESTful APIs, muitas vezes você precisará recuperar os parâmetros que foram enviados pelos métodos de requisição PUT, PATCH ou outro. Você pode recuperá-los chamando o método yii\web\Request::getBodyParam(). Por exemplo,

    $request = Yii::$app->request;

    // retorna todos os parâmetros
    $params = $request->bodyParams;

    // retorna o parâmetro "id"
    $param = $request->getBodyParam('id');

> Informação: Tirando os parâmetros `GET`, os parâmetros `POST`, `PUT`, `PATCH` e etc são enviados no corpo da requisição. O componente `request` analisará estes parâmetros quando você acessá-los através dos métodos descritos acima. Você pode personalizar a forma como estes parâmetros são analisados pela configuração da propriedade yii\web\Request::$parsers.

## Métodos da Requisição ¶

Você pode obter o método HTTP usado pela requisição atual através da expressão `Yii::$app->request->method`. Um conjunto de propriedades booleanas também são fornecidos para que você consiga verificar se o método atual é o correto. Por exemplo,

    $request = Yii::$app->request;

    if ($request->isAjax) { /* a requisição é uma requisição Ajax */ }
    if ($request->isGet)  { /* o método da requisição é GET */ }
    if ($request->isPost) { /* o método da requisição é POST */ }
    if ($request->isPut)  { /* o método da requisição é PUT */ }

## URLs da Requisição ¶

O componente `request` fornece muitas formas de inspecionar a atual URL da requisição. Assumindo que a URL da requisição seja `http://example.com/admin/index.php/product?id=100`, você pode obter várias partes desta URL através das propriedades explicadas a seguir:

- url: retorna `/admin/index.php/product?id=100`, que é a URL sem as informações de protocolo e de domínio.
- absoluteUrl: retorna `http://example.com/admin/index.php/product?id=100`, que é a URL completa, incluindo as informações de protocolo e de domínio.
- hostInfo: retorna `http://example.com`, que são as informações de protocolo e de domínio da URL.
- pathInfo: retorna `/product`, que é a informação depois do script de entrada e antes da interrogação (da query string).
- queryString: retorna `id=100`, que é a informação depois da interrogação.
- baseUrl: retorna `/admin`, que é a informação depois do domínio e antes do script de entrada.
- scriptUrl: retorna `/admin/index.php`, que é a informação depois do domínio até o script de entrada, inclusive.
- serverName: retorna `example.com`, que é o domínio da URL.
- serverPort: retorna 80, que é a porta usada pelo servidor Web.

## Cabeçalho HTTP ¶

Você pode obter as informações do cabeçalho HTTP através da coleção de cabeçalho retornado pela propriedade yii\web\Request::$headers. Por exemplo,

    // $headers é um objeto de yii\web\HeaderCollection
    $headers = Yii::$app->request->headers;

    // retorna o valor do cabeçalho Accept
    $accept = $headers->get('Accept');

    if ($headers->has('User-Agent')) { /* existe o cabeçalho User-Agent */ }

O componente `request` também fornece suporte para fácil acesso de alguns cabeçalhos mais utilizados, incluindo:

- userAgent: retorna o valor do cabeçalho `User-Agent`.
- contentType: retorna o valor do cabeçalho `Content-Type` que indica o tipo MIME dos dados do corpo da requisição.
- acceptableContentTypes: retorna os tipos MIME acessíveis pelos usuários. Os tipos retornados são ordenados pela sua pontuação de qualidade. Tipos com mais pontuação aparecerão nas primeiras posições.
- acceptableLanguages: retorna os idiomas acessíveis pelos usuários. Os idiomas retornados são ordenados pelo nível de preferência. O primeiro elemento representa o idioma de maior preferência.

Se a sua aplicação suportar diversos idiomas e quiser exibir páginas no idioma de maior preferência do usuário, você pode usar o método de negociação yii\web\Request::getPreferredLanguage(). Este método pega uma lista de idiomas suportadas pela sua aplicação e compara com acceptableLanguages, para retornar o idioma mais adequado.

> Dica: Você também pode utilizar o filtro ContentNegotiator para determinar dinamicamente qual tipo de conteúdo e idioma que deve ser utilizado na resposta. O filtro implementa negociação de conteúdo em cima das propriedades e métodos descritos acima.

## Informações do Cliente ¶

Você pode obter o nome do domínio ou endereço IP da máquina do cliente através das propriedades userHost e userIP, respectivamente. Por exemplo,

    $userHost = Yii::$app->request->userHost;
    $userIP = Yii::$app->request->userIP;