[к списку]

REST-чат

Необходимо написать клиент-серверную систему (REST-служба (сервер) и REST-потребитель (клиент)), реализующую простой онлайн-чат.
  1. Клиент может быть выполнен в виде приложения с графическим интерфейсом, веб-приложения или консольного приложения.
  2. Клиент должен уметь аутентифицироваться (используя указанное пользователем имя) на сервере. Если в данный момент на сервере имеется активный клиент с указанным именем, сервер отвечает ошибкой, и клиент должен выбрать другое имя. При успешной аутентификации клиенту возвращается токен, используемый в остальных запросах для идентификации.
  3. Клиент должен уметь отправлять текстовые сообщения на сервер, а сервер - хранить полную историю сообщений. Вновь подключившиеся клиенты должны запросить и показать историю сообщений.
  4. При корректном завершении работы клиент должен сообщить серверу о своём отключении с помощью операции /logout, после чего сервер освобождает соответствующее имя пользователя.
  5. На клиенте при входе и выходе других клиентов должны выводиться соответствующие сообщения (а также факт, выпал ли клиент по таймауту)
  6. Если при подключении к серверу произошла ошибка, клиент должен вывести об этом сообщение и пытаться переподключиться к нему. Если после переподключения сервер выдаёт статус 403, то клиент должен заново аутентифицироваться.
  7. Клиент должен уметь выводить актуальный список сообщений и активных пользователей в чате. Для этого можно использовать периодические запросы к серверу (раз в секунду), либо реализовать механизм long-polling (в описании методов ниже он не предусмотрен)
    • В случае консольного приложения для просмотра списка активных пользователей можно предусмотреть специальную команду (например, воспринимать ввод сообщения /list как команду).
  8. Для реализации не допускается использовать готовые библиотеки и фреймворки для работы с RESTful API (кроме браузерной реализации клиента). Использование HTTP-библиотек допускается.
  9. Соединения, с которых долго не поступают запросы, должны быть закрыты.
  10. Коды состояния HTTP, которые должен выдавать сервер в нештатных ситуациях:
    1. Если токен, присланный пользователем в запросе, неизвестен серверу: HTTP 403.
    2. Если токен в запросе отсутствует: HTTP 401.
    3. Если запрос не соответствует формату, который ожидался по данному адресу (для этого ресурса): HTTP 400.
    4. Если в запросе указан метод, который не поддерживается по данному адресу (для этого ресурса): HTTP 405.
    5. В целях отладки при обработке запросов предлагается сообщения об исключительных ситуациях (exceptions) отправлять клиенту в качестве ответа с кодом состояния HTTP 500.
Рекомендуется начать с реализации сервера, и для его проверки использовать готовые REST клиенты (например, плагин для Chrome).

Литература:
  1. https://habrahabr.ru/post/215117/
  2. https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP
  3. https://habrahabr.ru/post/38730/
Баллов за задачу: 2

Сервер должен поддерживать следующие запросы:

Вход

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!"
}