[к списку]
REST-чат
Необходимо написать клиент-серверную систему (REST-служба (сервер) и REST-потребитель (клиент)), реализующую простой онлайн-чат.
-
Клиент может быть выполнен в виде приложения с графическим интерфейсом, веб-приложения или консольного приложения.
-
Клиент должен уметь аутентифицироваться (используя указанное пользователем имя) на сервере. Если в данный момент на сервере имеется активный клиент с указанным именем, сервер отвечает ошибкой, и клиент должен выбрать другое имя. При успешной аутентификации клиенту возвращается токен, используемый в остальных запросах для идентификации.
-
Клиент должен уметь отправлять текстовые сообщения на сервер, а сервер - хранить полную историю сообщений. Вновь подключившиеся клиенты должны запросить и показать историю сообщений.
-
При корректном завершении работы клиент должен сообщить серверу о своём отключении с помощью операции
/logout
, после чего сервер освобождает соответствующее имя пользователя.
-
На клиенте при входе и выходе других клиентов должны выводиться соответствующие сообщения (а также факт, выпал ли клиент по таймауту)
-
Если при подключении к серверу произошла ошибка, клиент должен вывести об этом сообщение и пытаться переподключиться к нему. Если после переподключения сервер выдаёт статус 403, то клиент должен заново аутентифицироваться.
-
Клиент должен уметь выводить актуальный список сообщений и активных пользователей в чате. Для этого можно использовать периодические запросы к серверу (раз в секунду), либо реализовать механизм long-polling (в описании методов ниже он не предусмотрен)
-
В случае консольного приложения для просмотра списка активных пользователей можно предусмотреть специальную команду (например, воспринимать ввод сообщения
/list
как команду).
-
Для реализации не допускается использовать готовые библиотеки и фреймворки для работы с RESTful API (кроме браузерной реализации клиента). Использование HTTP-библиотек допускается.
-
Соединения, с которых долго не поступают запросы, должны быть закрыты.
-
Коды состояния HTTP, которые должен выдавать сервер в нештатных ситуациях:
-
Если токен, присланный пользователем в запросе, неизвестен серверу: HTTP 403.
-
Если токен в запросе отсутствует: HTTP 401.
-
Если запрос не соответствует формату, который ожидался по данному адресу (для этого ресурса): HTTP 400.
-
Если в запросе указан метод, который не поддерживается по данному адресу (для этого ресурса): HTTP 405.
-
В целях отладки при обработке запросов предлагается сообщения об исключительных ситуациях (exceptions) отправлять клиенту в качестве ответа с кодом состояния HTTP 500.
Рекомендуется начать с реализации сервера, и для его проверки использовать готовые REST клиенты (например, плагин для Chrome).
Сервер должен поддерживать следующие запросы:
Вход
POST /login
Content-Type: application/json
{
"username": "<username>"
}
Ответ:
HTTP 200 OK
Content-Type: application/json
{
"id": 1,
"username": "<username>",
"online": true,
"token": "<sometoken>"
}
Если имя пользователя уже занято активным пользователем, сервер должен отвечать ошибкой с кодом состояния HTTP 401 и заголовком WWW-Authenticate
со значением Token realm='Username is already in use'
.
Выход
POST /logout
Authorization: Token <sometoken>
Ответ:
HTTP 200 OK
Content-Type: application/json
{
"message": "bye!"
}
Список пользователей
GET /users
Authorization: Token <sometoken>
Ответ:
HTTP 200 OK
Content-Type: application/json
{
"users": [
{
"id": 1,
"username": "Vasya",
"online": true
},
{
"id": 2,
"username": "Kolya",
"online": true
}
]
}
Выводит список всех активных пользователей.
Информация о пользователе
GET /users/<id>
Authorization: Token <sometoken>
Ответ:
HTTP 200 OK
Content-Type: application/json
{
"id": 1,
"username": "Vasya",
"online": null
}
Если поле online имеет значение null, то пользователь выпал по таймауту.
Если пользователь с указанным id не известен, сервер должен отвечать ошибкой с кодом состояния HTTP 404.
Список сообщений
GET /messages?offset=<offset>&count=<count>
Authorization: Token <sometoken>
Аргументы:
offset — отступ от сообщения с id 0 (по умолчанию 0).
count — сколько (по умолчанию 10, не более 100)
Ответ:
HTTP 200 OK
Content-Type: application/json
{
"messages": [
{
"id": 1,
"message": "hello world!",
"author": 1
},
{
"id": 2,
"message": "hi!",
"author": 2
}
]
}
Возвращает список сообщений, имеющих id начиная с
offset
(сколько есть, но не более
count
).
Отправка сообщения
POST /messages
Authorization: Token <sometoken>
Content-Type: application/json
{
"message": "hello world!"
}
Отправляет новое сообщение
Ответ:
HTTP 200 OK
Content-Type: application/json
{
"id": <id>,
"message": "hello world!"
}