|
|
|
Peticiones
|
|
|
|
==========
|
|
|
|
|
|
|
|
Las peticiones (requests) hechas a una aplicación son representadas como objetos [[yii\web\Request]] que proporcionan
|
|
|
|
información como parámetros de la petición, cabeceras HTTP, cookies, etc. Dada una petición, se puede acceder al
|
|
|
|
objeto request correspondiente a través del [componente de aplicación](structure-application-components.md) `request`
|
|
|
|
que, por defecto, es una instancia de [[yii\web\Request]]. En esta sección se describirá como hacer uso de este
|
|
|
|
componente en las aplicaciones.
|
|
|
|
|
|
|
|
## Parámetros de Request <a name="request-parameters"></a>
|
|
|
|
|
|
|
|
Para obtener los parámetros de la petición, se puede llamar a los métodos [[yii\web\Request::get()|get()]] y
|
|
|
|
[[yii\web\Request::post()|post()]] del componente `request`. Estos devuelven los valores de `$_GET` y `$_POST`,
|
|
|
|
respectivamente. Por ejemplo:
|
|
|
|
|
|
|
|
```php
|
|
|
|
$request = Yii::$app->request;
|
|
|
|
|
|
|
|
$get = $request->get();
|
|
|
|
// equivalente a: $get = $_GET;
|
|
|
|
|
|
|
|
$id = $request->get('id');
|
|
|
|
// equivalente a: $id = isset($_GET['id']) ? $_GET['id'] : null;
|
|
|
|
|
|
|
|
$id = $request->get('id', 1);
|
|
|
|
// equivalente a: $id = isset($_GET['id']) ? $_GET['id'] : 1;
|
|
|
|
|
|
|
|
$post = $request->post();
|
|
|
|
// equivalente a: $post = $_POST;
|
|
|
|
|
|
|
|
$name = $request->post('name');
|
|
|
|
// equivalente a: $name = isset($_POST['name']) ? $_POST['name'] : null;
|
|
|
|
|
|
|
|
$name = $request->post('name', '');
|
|
|
|
// equivalente a: $name = isset($_POST['name']) ? $_POST['name'] : '';
|
|
|
|
```
|
|
|
|
|
|
|
|
> Información: En lugar de acceder directamente a `$_GET` y `$_POST` para obtener los parámetros de la petición, es
|
|
|
|
recomendable que se obtengan mediante el componente `request` como en el ejemplo anterior. Esto facilitará la
|
|
|
|
creación de tests ya que se puede simular una componente de request con datos de peticiones personalizados.
|
|
|
|
|
|
|
|
Cuando se implementan [APIs RESTful](rest-quick-start.md), a menudo se necesita obtener parámetros enviados desde el
|
|
|
|
formulario a través de PUT, PATCH u otros [métodos de request](runtime-requests.md#request-methods). Se pueden obtener
|
|
|
|
estos parámetros llamando a los métodos [[yii\web\Request::getBodyParam()]]. Por ejemplo:
|
|
|
|
|
|
|
|
```php
|
|
|
|
$request = Yii::$app->request;
|
|
|
|
|
|
|
|
// devuelve todos los parámetros
|
|
|
|
$params = $request->bodyParams;
|
|
|
|
|
|
|
|
// devuelve el parámetro "id"
|
|
|
|
$param = $request->getBodyParam('id');
|
|
|
|
```
|
|
|
|
|
|
|
|
> Información: A diferencia de los parámetros `GET`, los parámetros enviados desde el formulario a través de `POST`,
|
|
|
|
`PUT`, `PATCH`, etc. se envían en el cuerpo de la petición. El componente `request` convierte los parámetros cuando
|
|
|
|
se acceda a él a través de los métodos descritos anteriormente. Se puede personalizar la manera en como los
|
|
|
|
parámetros se convierten configurando la propiedad [[yii\web\Request::parsers]].
|
|
|
|
|
|
|
|
## Métodos de Request <a name="request-methods"></a>
|
|
|
|
|
|
|
|
Se puede obtener el método HTTP usado por la petición actual a través de la expresión `Yii::$app->request->method`. Se
|
|
|
|
proporcionan un conjunto de propiedades booleanas para comprobar si el método actual es de un cierto tipo. Por ejemplo:
|
|
|
|
|
|
|
|
```php
|
|
|
|
$request = Yii::$app->request;
|
|
|
|
|
|
|
|
if ($request->isAjax) { // la request es una request AJAX }
|
|
|
|
if ($request->isGet) { // el método de la request es GET }
|
|
|
|
if ($request->isPost) { // el método de la request es POST }
|
|
|
|
if ($request->isPut) { // el método de la request es PUT }
|
|
|
|
```
|
|
|
|
|
|
|
|
## URLs de Request <a name="request-urls"></a>
|
|
|
|
|
|
|
|
El componente `request` proporciona muchas maneras de inspeccionar la URL solicitada actualmente.
|
|
|
|
|
|
|
|
Asumiendo que la URL que se está solicitando es `http://example.com/admin/index.php/product?id=100`, se pueden obtener
|
|
|
|
varias partes de la URL explicadas en los siguientes puntos:
|
|
|
|
|
|
|
|
* [[yii\web\Request::url|url]]: devuelve `/admin/index.php/product?id=100`, que es la URL sin la parte de información
|
|
|
|
del host.
|
|
|
|
* [[yii\web\Request::absoluteUrl|absoluteUrl]]: devuelve `http://example.com/admin/index.php/product?id=100`, que es
|
|
|
|
la URL entera, incluyendo la parte de información del host.
|
|
|
|
* [[yii\web\Request::hostInfo|hostInfo]]: devuelve `http://example.com`, que es la parte de información del host
|
|
|
|
dentro de la URL.
|
|
|
|
* [[yii\web\Request::pathInfo|pathInfo]]: devuelve `/product`, que es la parte posterior al script de entrada y
|
|
|
|
anterior al interrogante (query string)
|
|
|
|
* [[yii\web\Request::queryString|queryString]]: devuelve `id=100`, que es la parte posterior al interrogante.
|
|
|
|
* [[yii\web\Request::baseUrl|baseUrl]]: devuelve `/admin`, que es la parte posterior a la información del host y
|
|
|
|
anterior al nombre de script de entrada.
|
|
|
|
* [[yii\web\Request::scriptUrl|scriptUrl]]: devuelve `/admin/index.php`, que es la URL sin la información del la ruta
|
|
|
|
ni la query string.
|
|
|
|
* [[yii\web\Request::serverName|serverName]]: devuelve `example.com`, que es el nombre del host dentro de la URL.
|
|
|
|
* [[yii\web\Request::serverPort|serverPort]]: devuelve 80, que es el puerto que usa el servidor web.
|
|
|
|
|
|
|
|
## Cabeceras HTTP <a name="http-headers"></a>
|
|
|
|
|
|
|
|
Se pueden obtener la información de las cabeceras HTTP a través de [[yii\web\HeaderCollection|header collection]]
|
|
|
|
devueltas por la propiedad [[yii\web\Request::headers]]. Por ejemplo:
|
|
|
|
|
|
|
|
```php
|
|
|
|
// $headers es un objeto de yii\web\HeaderCollection
|
|
|
|
$headers = Yii::$app->request->headers;
|
|
|
|
|
|
|
|
// devuelve el valor Accept de la cabecera
|
|
|
|
$accept = $headers->get('Accept');
|
|
|
|
|
|
|
|
if ($headers->has('User-Agent')) { // la cabecera contiene un User-Agent }
|
|
|
|
```
|
|
|
|
|
|
|
|
El componente `request` también proporciona soporte para acceder rápidamente a las cabeceras usadas más comúnmente,
|
|
|
|
incluyendo:
|
|
|
|
|
|
|
|
* [[yii\web\Request::userAgent|userAgent]]: devuelve el valor de la cabecera `User-Agen`.
|
|
|
|
* [[yii\web\Request::contentType|contentType]]: devuelve el valor de la cabecera `Content-Type` que indica el tipo
|
|
|
|
MIME de los datos del cuerpo de la petición.
|
|
|
|
* [[yii\web\Request::acceptableContentTypes|acceptableContentTypes]]: devuelve los tipos de contenido MIME aceptado
|
|
|
|
por los usuarios, ordenados por puntuación de calidad. Los que tienen mejor puntuación, se devolverán primero.
|
|
|
|
* [[yii\web\Request::acceptableLanguages|acceptableLanguages]]: devuelve los idiomas aceptados por el usuario. Los
|
|
|
|
idiomas devueltos son ordenados según su orden de preferencia. El primer elemento representa el idioma preferido.
|
|
|
|
|
|
|
|
Si la aplicación soporta múltiples idiomas y se quiere mostrar las páginas en el idioma preferido por el usuario, se
|
|
|
|
puede usar el método de negociación de idioma [[yii\web\Request::getPreferredLanguage()]]. Este método obtiene una
|
|
|
|
lista de idiomas soportados por la aplicación, comparados con
|
|
|
|
[[yii\web\Request::acceptableLanguages|acceptableLanguages]], y devuelve el idioma más apropiado.
|
|
|
|
|
|
|
|
> Consejo: También se puede usar el filtro [[yii\filters\ContentNegotiator|ContentNegotiator]] para determinar
|
|
|
|
diatónicamente el content type y el idioma que debe usarse en la respuesta. El filtro implementa la negociación de
|
|
|
|
contenido en la parte superior de las propiedades y métodos descritos anteriormente.
|
|
|
|
|
|
|
|
## Información del cliente <a name="client-information"></a>
|
|
|
|
|
|
|
|
Se puede obtener el nombre del host y la dirección IP de la máquina cliente a través de
|
|
|
|
[[yii\web\Request::userHost|userHost]] y [[yii\web\Request::userIP|userIP]], respectivamente. Por ejemplo:
|
|
|
|
|
|
|
|
```php
|
|
|
|
$userHost = Yii::$app->request->userHost;
|
|
|
|
$userIP = Yii::$app->request->userIP;
|
|
|
|
```
|