Цель занятия: научиться создавать простые веб-приложения, принимающие ввод данных от пользователя.

При разработке приложения следуйте модели расположения файлов для маленьких приложений, описанной в официальной документации.

Обработка различных запросов

В рамках данной задачи вам необходимо научиться обрабатывать различные HTTP-пути с помощью RODA

  1. Реализуйте обработчик для пути /hello. Он должен возвращать строку Здравствуйте!.
  2. Реализуйте обработчик для пути /get/rng. Он должен возвращать строку Случайное значение: 535, где число — случайное значение в диапазоне от 100 до 5000.
  3. Реализуйте обработчик для пути /cool/hello/NAME/SURNAME. Он должен возвращать строку Здравствуйте, NAME SURNAME!.
  4. Реализуйте обработчик для пути /calc/min/NUM_ONE/NUM_TWO. Он должен возвращать минимальное значение из двух целых чисел, переданных в качестве значений NUM_ONE и NUM_TWO. Пример запроса: /calc/min/500/-100/
  5. Реализуйте обработчик для пути /calc/multiply/NUM_ONE/NUM_TWO. Он должен возвращать результат перемножения двух чисел, переданных в качестве значений пути NUM_ONE и NUM_TWO. Пример запроса: /calc/multiply/6.5/5.5. Приложение должно корректно обрабатывать ситуации, когда в качестве вещественных чисел были переданы строки.
  6. Реализуйте обработчик для пути /get/sophisticated/rng. Он принимает пару аргументов: min и max. Аргументы контролируют минимальные и максимальные значения для генератора случайных чисел. Маршрут должен корректно обрабатывать ситуации, когда
    • не были переданы данные аргументы, надо сообщать об этом пользователю;
    • в качестве значений были переданы не целые числа, надо сообщать об этом пользователю.

    Примеры запросов: /get/sophisticated/rng?min=100&max=5000, /get/sophisticated/rng?min=100, /get/sophisticated/rng?min=sto&max=5000

  7. Реализуйте обработчик для пути /worker/ID. По запросу должен возвращаться JSON-документ, содержащий информацию о сотруднике. Приложение должно корректно обрабатывать ситуации:

    • В качестве ID было передано не целое число. В результате должен быть возвращён следующий документ
    {
      "status": "error",
      "message": "Идентификатор сотрудника — целое число."
    }
    
    • По указанному ID не было найдено информации о сотруднике. В результате такого запроса должен быть возвращён следующий документ:
    {
      "status": "error",
      "message": "Сотрудник ID не найден в базе."
    }
    
    • По указанному ID был найден сотрудник. Ответ сервера:
    {
      "status": "success",
      "data": {
        "name": "Иван",
      }
    }
    

    В качестве источника данных используйте YAML-документ из прошлого занятия.

     ---
     people:
     - name: Иван
       patronymic: Иванович
       surname: Семёнов
       email: ivan.semenov@example.com
       avatar: https://www.gravatar.com/avatar/c941144838e03143e77a9fd40cb36dfa?d=retro&s=400
     - name: Сергей
       patronymic: Александрович
       surname: Краснов
       email: sergey.krasnov@example.com
       avatar: https://www.gravatar.com/avatar/d15aaf8ed63262edbc364c9395d54da4?d=retro&s=400
     - name: Наталья
       patronymic: Владимировна
       surname: Лихачёва
       email: natalia.lihacheva@example.com
       avatar: https://www.gravatar.com/avatar/4a236e4c48d7a8acb16e7221fdad03e3?d=retro&s=400
     - name: Пётр
       patronymic: Алексеевич
       surname: Соловьёв
       email: petr.soloviev@example.com
       avatar: https://www.gravatar.com/avatar/267d7ae01920c7ed15b40fdac2c5eed8?d=retro&s=400
    

Рекомендации по реализации

  1. Добавьте в Gemfile библиотеки roda и rerun.
  2. Сформируйте пустое приложение на Roda:

    require 'roda'
    
    class Application < Roda
    
      route do |r|
        r.root do
          'It is working!'
        end
      end
    end
    
  3. Подключите приложение в файле config.ru:

    require_relative 'application'
    
    run Application.freeze.app
    
  4. Запустите приложение с помощью rerun: bundle exec rerun rackup
  5. Используйте обработчик r.on, чтобы сформировать обработчики для дерева запросов. Используйте обработчик r.get для обработки GET-запросов по данному пути