/Lab-08-client

Primary LanguageCMakeMIT LicenseMIT

Лабораторная работа №7

Задание

Реализовать suggest сервис, обрабатывающий POST запрос по следующему URI: /v1/api/suggest.
Клиент отправляет POST запрос следующего формата:

{
  "input": "hel"
}

В поле input находится часть текста, который клиент хочет ввести.

На данный запрос сервис должен предложить варианты того, что клиент возможно хочет ввести.
Пример ответа:

{
  "suggestions": [
    {
      "text": "hello",
      "position": 0
    },
    {
      "text": "hello world",
      "position": 1
    },
    {
      "text": "helm",
      "position": 2
    }
  ]
}

В случае если сервису нечего предложить он возвращает пустой массив suggestions.

Сервис варианты ответа считывает при инициализации и обновляет в ходе работы
из конфигурационного файла suggestions.json в коллекцию suggestions.
Обновление коллекции suggestions происходит каждые 15 минут из того же файла.

Пример содержимого фала suggestions.json:

[
  {
    "id": "hel",
    "name": "hello world",
    "cost": 70
  },
  {
    "id": "hel",
    "name": "hello",
    "cost": 10
  },
  {
    "id": "hel",
    "name": "helm",
    "cost": 200
  }
]

Для синхронизации доступа к коллекции suggestions стоит использовать std::shared_mutex.
Read блокировка осуществляется в коде обработчика, а Write блокировка в функции обновления коллекции suggestions.

Поле cost определяет значение поля position: чем больше cost тем меньше значение position.
(чем ниже стоимость, тем выше вариант)

Рекомендации

  • для реализации HTTP сервера используйте готовые библиотеки
  • в пакетном менеджере hunter есть несколько библиотек для работы с сетью. Например, Boost.Beast
  • у хороших библиотек есть наглядные примеры работы с этими библиотеками. Например, простой синхнорнный http сервер на основе Boost.Beast
  • тестирование сервера выполнить с помощью утилиты curl (документацию с примерами можно найти здесь).

Links