Часть 1: что такое REST
В этой части мы подробно рассмотрим, каким образом происходит коммуникация между клиентом и сервером. Попутно мы будем раскрывать новые термины и давать к ним пояснения.
Чтобы все было (стало) понятно, будем разбирать клиент-серверную коммуникацию на примере некоторого RESTful приложения.
Допустим, мы разрабатываем веб приложение, которое способно хранить информацию о клиентах и их заказах. Т.е. наша система способна манипулировать некоторыми сущностями: создавать их, редактировать, удалять, выдавать информацию о них.
Этими сущностями будут:

- clients — клиенты;
- orders — заказы клиентов;
- items — товары.
Запросы
Клиентские запросы практически всегда сделаны по протоколу HTTP. В общем, HTTP запросы состоят из нескольких составляющих:- HTTP метод;
- заголовок;
- URI;
- тело запроса.
URI и Ресурсы
Данные, которые получают или изменяют клиенты посредством запросов, называют ресурсами. Основа клиент-серверного взаимодействия — манипуляция над ресурсами. Ресурсы в REST — это все, чему можно дать имя. Это в каком то смысле как классы в Java. В Java мы можем создать класс для чего угодно. Так и в REST — ресурсом может быть что угодно: пользователь, документ, отчет, заказ. Все это может быть как абстракцией некоторой сущности, так и чем-то конкретным, например, файлом — картинкой, видео, анимацией, PDF файлом. В рамках нашего примера у нас есть 3 ресурса:- clients — клиенты;
- orders — заказы клиентов;
- items — товары.
- /clients — URI всех имеющихся клиентов;
- /clients/23 — URI конкретного клиента, а именно клиента с ID=23;
- /clients/4 — URI конкретного клиента, а именно клиента с ID=4.
- /clients/4/orders — URI всех заказов клиента №4;
- /clients/1/orders/12 — URI заказа №12 клиента №1.
- /clients/1/orders/12/items — URI списка всех товаров в заказе №12 сделанного клиентом №1.
HTTP метод
Метод HTTP (англ. HTTP Method) — последовательность из любых символов, кроме управляющих и разделителей, которая указывает на основную операцию над ресурсом. Существует несколько общепринятых методов HTTP. Перечислим те из них, которые наиболее часто используются в RESTful сервисах:- GET — служит для получения информации о конкретном ресурсе (через ID) либо о коллекции ресурсов;
- POST — служит для создания нового ресурса;
- PUT — служит для изменения ресурса (через ID);
- DELETE — служит для удаления ресурса (через ID).
Заголовки
В запросах, как собственно и в ответах, присутствуют HTTP заголовки. В них отправляется дополнительная информация о запросе (либо ответе). Заголовки представляют собой пары ключ-значение. Список наиболее распространенных заголовков можешь почитать на странице в Википедии. Применительно к REST клиенты часто могут слать в запросе к серверу заголовок Accept. Он нужен, чтобы дать серверу понять, в каком формате клиент ожидает получить от него ответ. Различные варианты форматов представлены в так называемом списке MIME-типов. MIME (англ. Multipurpose Internet Mail Extensions — многоцелевые расширения интернет-почты) — спецификация для кодирования информации и форматирования сообщений таким образом, чтобы их можно было пересылать по интернету. Каждый MIME тип состоит из двух частей, разделяемых слэшем — из типа и подтипа. Примеры MIME-типов для разных видов файлов:- text — text/plain, text/css, text/html;
- image — image/png, image/jpeg, image/gif;
- audio — audio/wav, audio/mpeg;
- video — video/mp4, video/ogg;
- application — application/json, application/pdf, application/xml, application/octet-stream.
Accept:application/json
Данный заголовок говорит серверу, что клиент ожидает получить ответ в JSON формате.
Тело запроса
Пересылаемое клиентом сообщение на сервер. Есть у запроса тело или нет, зависит от типа HTTP запроса. Например, запросы GET и DELETE как правило не содержат никакого тела запроса. А вот PUT и POST могут содержать: тут все дело в функциональном назначении типа запроса. Ведь для получения данных и удаления по id (который передается в URL) не нужно слать на сервер дополнительные данные. А вот для создания нового ресурса (запрос POST) нужно этот ресурс передать. Также как и для модификации существующего ресурса. В REST для передачи тела запроса чаще всего используют форматы XML или JSON. Наиболее часто встречается JSON формат. Предположим, мы хотим отправить на сервер запрос, а в нем — создать новый ресурс. Если ты не забыл, в качестве примера мы рассматривали приложение, которое управляет заказами клиентов. Допустим, мы хотим создать нового клиента. В нашем случае мы храним следующую информацию о клиентах: Имя Email Номер телефона Тогда телом такого запроса может быть следующий JSON:
{
"name" : "Amigo",
"email" : "amigo@jr.com",
"phone" : "+7 (191) 746-43-23"
}
Собираем запросы воедино
Итак, мы рассмотрели с тобой из чего может состоять клиентский запрос. Приведем теперь несколько примеров запросов с описаниемЗапрос | Описание |
---|---|
|
Получить информацию о клиенте №23 в формате json или xml |
|
Создать нового клиента с полями: Имя — Amigo Email — amigo@jr.com Тел. — +7 (191) 746-43-23 |
|
Редактировать клиента №1 в следующим образом: Имя — Ben Email — bigben@jr.com Тел. — +380 (190) 346-42-13 |
|
Удалить из системы заказ №6 у клиента №12 |
Ответы
Скажем пару слов об ответах сервера. Ответ как правило состоит из следующих частей:- код ответа;
- заголовки;
- тело ответа.
Коды HTTP ответов
Рассмотрим подробнее коды HTTP ответов. Приведем цитату из Википедии: Код состояния HTTP (англ. HTTP status code) — часть первой строки ответа сервера при запросах по протоколу HTTP. Он представляет собой целое число из трёх десятичных цифр. Первая цифра указывает на класс состояния. За кодом ответа обычно следует отделенная пробелом поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа. Примеры:- 201 Created;
- 401 Unauthorized;
- 507 Insufficient Storage.
- 1ХХ — информационные;
- 2ХХ — информируют о случаях успешного принятия и обработки запроса клиента;
- 3ХХ — сообщают клиенту, что для успешного выполнения операции необходимо сделать другой запрос, как правило по другому URI;
- 4ХХ — ошибка клиента. Например, неправильно составленный запрос или же широко известный код 404 Not Found, которая может возникнуть, когда клиент запрашивает несуществующий ресурс;
- 5ХХ — ошибка сервера. Возвращается клиенту в случае неудачного выполнения операции по вине сервера.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ