Отправка данных на сервер #

Васильев Андрей Михайлович, 2024

Версии презентации

HTML-формы #

В рамках интернета гипертекста для изменения состояния на сервере используются HTML-формы, с помощью которых пользователь формирует набор параметров

diagram

GET и POST-запросы #

Формы, формирующие GET-запросы, передают данные в параметрах запроса в формате application/x-www-form-urlencoded

Формы, формирующие POST-запросы, передают данные в теле запроса с использованием следующих кодировок:

  • application/x-www-form-urlencoded — данные кодируются в форме данных URL-запроса, но в отличие от последнего нет ограничения на длину
  • multipart/form-data — данные передаются в бинарном виде, подходит для отправки файлов на сервер, требуют отдельной обработки в http4k
  • text/plain — подходит для низкоуровневой отладки, почти не используется

Тип кодировки формы задаётся с помощью атрибута формы enctype, а на сервер передаётся в заголовке Content-Type

В рамках данной лекции рассмотрим обработку первого типа кодировок данных

Обработка POST-запросов #

Для обработки POST, PUT, DELETE, PATCH-запросов необходимо добавить соответствующие записи на уровень маршрутизатора:

routes(
    "/posts/" bind Method.POST to addNewPostHandler(),
)

Перечисление org.http4k.core.Method содержит список всех определённых в стандарте HTTP методов

Обработка данных в формате application/x-www-form-urlencoded #

От клиента к серверу все данные передаются в виде пар ключ-значение, схожим образом с параметрами URI-запроса: может быть несколько одинаковых ключей

Класс Request предоставляет следующие методы для получения данных из тела формы:

  • fun Request.form(name: String): String? — получить значение поля по названию ключа, при каждом вызове происходит разбор всей строки (не эффективный)
  • fun Request.form(): Form — получить весь набор параметров
  • fun Request.form(name: String, value: String): Request — указать новое значение для поля формы внутри объекта-запроса, подходит для тестирования
  • fun Request.formAsMap(): Map<String, List<String?>> — получить список значений в форме словаря

Особенности указанных функций

  • Тип данных Form является псевдонимом типа Parameters: typealias Form = Parameters, т.е. поддерживает все соответствующие функции
  • Для работы со словарём предоставляется метод getFirst(key: String), позволяющий извлечь первый элемент из списка значений ключа

Полный сценарий обработки формы #

diagram

Обработка данных в формате application/json #

При получении данных в формате JSON внутри тела запроса должна содержаться строка в формате JSON

В рамках HTTP-обработчика:

  1. Необходимо извлечь строку документа из тела запроса
  2. Проверить, что она представляет собой JSON-документ
  3. Извлечь из переданного JSON-документа необходимые данные

Шаг № 1 достигается с помощью функции bodyString(): String у объекта-запроса

Шаги № 2 и № 3 реализуются средствами выбранной JSON-библиотеки

В случае возникновения технической или логической ошибок о них необходимо сообщить пользователю