Отправка данных на сервер
#
Васильев Андрей Михайлович, 2024
Версии презентации
HTML-формы
#
В рамках интернета гипертекста для изменения состояния на сервере используются
HTML-формы, с помощью которых пользователь формирует набор параметров
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 методов
От клиента к серверу все данные передаются в виде пар ключ-значение, схожим
образом с параметрами 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-библиотеки
В случае возникновения технической или логической ошибок о них необходимо
сообщить пользователю