Commit abbdf10c by Dmitry Korolev

content translated

parent c9f8644d
Response Formatting Форматирование ответа
=================== ===================
When handling a RESTful API request, an application usually takes the following steps that are related При обработке RESTful API запросов приложение обычно выполняет следующие шаги, связанные с форматированием ответа:
with response formatting:
1. Determine various factors that may affect the response format, such as media type, language, version, etc. 1. Определяет различные факторы, которые могут повлиять на формат ответа, такие как media type, язык, версия и т.д.
This process is also known as [content negotiation](http://en.wikipedia.org/wiki/Content_negotiation). Этот процесс также известен как [обсуждение содержимого](http://en.wikipedia.org/wiki/Content_negotiation).
2. Convert resource objects into arrays, as described in the [Resources](rest-resources.md) section. 2. Конвертирует объекты ресурсов в массивы, как описано в секции [Ресурсы](rest-resources.md).
This is done by [[yii\rest\Serializer]]. Это задача для [[yii\rest\Serializer]].
3. Convert arrays into a string in the format as determined by the content negotiation step. This is 3. Конвертирует массивы в строке в формате, определенном на этапе обсуждения содержимого. Это задача для
done by [[yii\web\ResponseFormatterInterface|response formatters]] registered with [[yii\web\ResponseFormatterInterface|форматера ответов]], регистрируемого с помощью компонента приложения
the [[yii\web\Response::formatters|response]] application component. [[yii\web\Response::formatters|response]].
## Content Negotiation <a name="content-negotiation"></a> ## Обсуждение содержимого <a name="content-negotiation"></a>
Yii supports content negotiation via the [[yii\filters\ContentNegotiator]] filter. The RESTful API base Yii поддерживает обсуждение содержимого с помощью фильтра [yii\filters\ContentNegotiator]]. Базовый класс
controller class [[yii\rest\Controller]] is equipped with this filter under the name of `contentNegotiator`. контроллера RESTful API [[yii\rest\Controller]] использует этот фильтр под именем `contentNegotiator`.
The filer provides response format negotiation as well as language negotiation. For example, if a RESTful Фильтр обеспечивает соответствие формата ответа и определение языка. Например, если RESTful API запрос
API request contains the following header, содержит следующий заголовок:
``` ```
Accept: application/json; q=1.0, */*; q=0.1 Accept: application/json; q=1.0, */*; q=0.1
``` ```
it will get a response in JSON format, like the following: Он будет получать ответ в формате JSON следующего вида:
``` ```
$ curl -i -H "Accept: application/json; q=1.0, */*; q=0.1" "http://localhost/users" $ curl -i -H "Accept: application/json; q=1.0, */*; q=0.1" "http://localhost/users"
...@@ -56,15 +55,15 @@ Content-Type: application/json; charset=UTF-8 ...@@ -56,15 +55,15 @@ Content-Type: application/json; charset=UTF-8
] ]
``` ```
Behind the scene, before a RESTful API controller action is executed, the [[yii\filters\ContentNegotiator]] Под копотом происходит следующее: прежде, чем экшн RESTful API контроллера будет выполнен, фильтр
filter will check the `Accept` HTTP header in the request and set the [[yii\web\Response::format|response format]] [[yii\filters\ContentNegotiator]] проверит HTTP-заголовок `Accept` в запросе и установит, что
to be `'json'`. After the action is executed and returns the resulting resource object or collection, [[yii\web\Response::format|формат ответа]] должен быть в `'json'`. После того, как экшн будет выполнен и вернет
[[yii\rest\Serializer]] will convert the result into an array. And finally, [[yii\web\JsonResponseFormatter]] результирующий объект ресурса или коллекцию, [[yii\rest\Serializer]] конвертирует результат в массив.
will serialize the array into a JSON string and include it in the response body. И, наконец, [[yii\web\JsonResponseFormatter]] сериализует массив в строку JSON и включит ее в тело ответа.
By default, RESTful APIs support both JSON and XML formats. To support a new format, you should configure По умолчанию, RESTful APIs поддерживает и JSON, и XML форматы. Для того, чтобы добавить поддержку нового формата,
the [[yii\filters\ContentNegotiator::formats|formats]] property of the `contentNegotiator` filter like вы должны установить свою конфигурацию для свойства [[yii\filters\ContentNegotiator::formats|formats]] у фильтра
the following in your API controller classes: `contentNegotiator`, похожую на следующие классы контроллеров API:
```php ```php
use yii\web\Response; use yii\web\Response;
...@@ -77,21 +76,21 @@ public function behaviors() ...@@ -77,21 +76,21 @@ public function behaviors()
} }
``` ```
The keys of the `formats` property are the supported MIME types, while the values are the corresponding Ключи свойства `formats` - это поддерживаемые MIME-типы, а их значения должны соответствовать именам
response format names which must be supported in [[yii\web\Response::formatters]]. форматов ответа, которые установлены в [[yii\web\Response::formatters]].
## Data Serializing <a name="data-serializing"></a> ## Сериализация данных <a name="data-serializing"></a>
As we have described above, [[yii\rest\Serializer]] is the central piece responsible for converting resource Как уже описано выше, [[yii\rest\Serializer]] - это центральное место, отвечащее за конвертацию объектов ресурсов
objects or collections into arrays. It recognizes objects implementing [[yii\base\ArrayableInterface]] as или коллекций в массивы. Он реализует интерфейсы [[yii\base\ArrayableInterface]] и [[yii\data\DataProviderInterface]].
well as [[yii\data\DataProviderInterface]]. The former is mainly implemented by resource objects, while [[yii\base\ArrayableInterface]] реализуется для объектов ресурсов, а [[yii\data\DataProviderInterface]] - для коллекций.
the latter resource collections.
Вы можете переконфигурировать сереализатор с помощью настройки свойства [[yii\rest\Controller::serializer]], используя
конфигурационный массив. Например, иногда вам может быть нужно помочь упростить разработку на клиенте с помощью
добавления информации о пагинации непосредственно в тело ответа. Чтобы сделать это, переконфигурируйте свойство
[[yii\rest\Serializer::collectionEnvelope]] следующим образом:
You may configure the serializer by setting the [[yii\rest\Controller::serializer]] property with a configuration array.
For example, sometimes you may want to help simplify the client development work by including pagination information
directly in the response body. To do so, configure the [[yii\rest\Serializer::collectionEnvelope]] property
as follows:
```php ```php
use yii\rest\ActiveController; use yii\rest\ActiveController;
...@@ -106,7 +105,7 @@ class UserController extends ActiveController ...@@ -106,7 +105,7 @@ class UserController extends ActiveController
} }
``` ```
You may then get the following response for request `http://localhost/users`: Тогда вы можете получить следующий ответ на запрос `http://localhost/users`:
``` ```
HTTP/1.1 200 OK HTTP/1.1 200 OK
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment