Кодирование содержимого и JSON
Декодируйте и кодируйте тела запросов и ответов.
«Кодирование содержимого и JSON» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Протокол Content
Модели Vapor, передаваемые по HTTP, соответствуют протоколу Content. Content основан на Codable языка Swift и дополнительно позволяет автоматически декодировать данные из тел запросов и кодировать их в ответы.
import Vapor
struct Todo: Content {
var id: Int?
var title: String
var done: Bool
}Кодирование ответа в JSON
Верните из обработчика любое значение типа Content, и Vapor закодирует его в JSON, самостоятельно установив правильный заголовок Content-Type.
app.get("todo") { req -> Todo in
Todo(id: 1, title: "Learn Vapor", done: false)
}Декодирование тела запроса
Прочитайте типизированные данные из входящего запроса с помощью req.content.decode(_:). Vapor анализирует Content-Type и соответствующим образом разбирает JSON или данные формы.
app.post("todo") { req -> Todo in
let incoming = try req.content.decode(Todo.self)
return incoming
}Массивы как Content
Коллекции типов Content автоматически кодируются в массивы JSON. Верните [Todo], и клиент получит список JSON.
app.get("todos") { req -> [Todo] in
[Todo(id: 1, title: "A", done: false),
Todo(id: 2, title: "B", done: true)]
}Пользовательские ключи кодирования
Поскольку Content соответствует Codable, Вы можете сопоставлять имена свойств Swift с другими ключами JSON с помощью CodingKeys — это полезно для API со snake_case.
struct User: Content {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}Настройка кодировщика JSON
С помощью ContentConfiguration можно задать глобальную стратегию кодирования, например преобразовывать все ключи в snake_case или форматировать даты по стандарту ISO-8601.
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
encoder.dateEncodingStrategy = .iso8601
ContentConfiguration.global.use(encoder: encoder, for: .json)Проверка декодированного содержимого
Протокол Validatable Vapor позволяет объявлять правила проверки. Вызовите try Todo.validate(content: req) перед декодированием, чтобы отклонить некорректные входные данные с понятной ошибкой 400.
extension Todo: Validatable {
static func validations(_ v: inout Validations) {
v.add("title", as: String.self, is: !.empty)
}
}Использование проверки в обработчике
Сначала выполните проверку, затем декодируйте данные. Если проверка не пройдена, Vapor автоматически выбрасывает ошибку, и клиент получает информативный ответ с ошибкой.
app.post("todo") { req -> Todo in
try Todo.validate(content: req)
return try req.content.decode(Todo.self)
}Раздельные DTO для запроса и ответа
Хорошая практика — использовать отдельные типы для входных и выходных данных. Например, CreateTodo без идентификатора для запросов и полный Todo для ответов. Это отделяет API от внутренних моделей.
struct CreateTodo: Content {
var title: String
}
struct TodoResponse: Content {
var id: Int
var title: String
}Кодирование строк запроса
Тот же механизм Content декодирует строки запроса в структуру через req.query.decode(_:), что особенно удобно для параметров фильтрации и постраничной выдачи.
struct Page: Content {
var page: Int?
var size: Int?
}
app.get("items") { req -> String in
let p = try req.query.decode(Page.self)
return "page=" + String(p.page ?? 1)
}Возврат содержимого с пользовательским статусом
Чтобы управлять и телом, и статусом, создайте Response и закодируйте в него содержимое либо верните конструкцию, подобную кортежу. В приведённом ниже примере устанавливаются статус 201 «Создано» и тело в формате JSON.
app.post("todo") { req -> Response in
let todo = try req.content.decode(Todo.self)
let res = Response(status: .created)
try res.content.encode(todo)
return res
}Быстрая проверка: Content и JSON
Проверьте свои знания кодирования.
Итоги: Content и кодирование JSON
Вы узнали, как данные передаются по сети в Vapor:
- Приводите модели к
Content, основанному наCodable. - Возвращайте содержимое для кодирования в JSON; используйте
req.content.decodeдля чтения тел запросов. - Настраивайте ключи и даты с помощью
CodingKeysиContentConfiguration. - Проверяйте входные данные с помощью
Validatableи рассматривайте возможность создания отдельных DTO для запросов и ответов.
Часто задаваемые вопросы
Урок «Кодирование содержимого и JSON» бесплатный?
Да — полный текст урока «Кодирование содержимого и JSON» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Кодирование содержимого и JSON»?
Декодируйте и кодируйте тела запросов и ответов. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Кодирование содержимого и JSON»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Маршрутизация и обработка запросов
- Кодирование содержимого и JSON
- Fluent ORM и модели
- Промежуточное ПО и аутентификация