0Pricing
Swift Academy · Урок

Кодирование содержимого и 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 — локальная установка не требуется.

Все уроки этого курса

  1. Маршрутизация и обработка запросов
  2. Кодирование содержимого и JSON
  3. Fluent ORM и модели
  4. Промежуточное ПО и аутентификация
← Назад к Swift Academy