Отправка данных на сервер #
Васильев Андрей Михайлович, 2024
Версии презентации
HTML-формы #
В рамках интернета гипертекста для изменения состояния на сервере используются HTML-формы, с помощью которых пользователь формирует набор параметров
GET и POST-запросы #
Формы, формирующие GET-запросы, передают данные в параметрах запроса в формате
application/x-www-form-urlencoded
Формы, формирующие POST-запросы, передают данные в теле запроса с использованием следующих кодировок:
application/x-www-form-urlencoded
— данные кодируются в форме данных URL-запроса, но в отличие от последнего нет ограничения на длинуmultipart/form-data
— данные передаются в бинарном виде, подходит для отправки файлов на сервер, требуют отдельной обработки в http4ktext/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)
, позволяющий извлечь первый элемент из списка значений ключа
Полный сценарий обработки формы #
Обработка данных в формате application/json
#
При получении данных в формате JSON внутри тела запроса должна содержаться строка в формате JSON
В рамках HTTP-обработчика:
- Необходимо извлечь строку документа из тела запроса
- Проверить, что она представляет собой JSON-документ
- Извлечь из переданного JSON-документа необходимые данные
Шаг № 1 достигается с помощью функции bodyString(): String
у объекта-запроса
Шаги № 2 и № 3 реализуются средствами выбранной JSON-библиотеки
В случае возникновения технической или логической ошибок о них необходимо сообщить пользователю