Codificação de Conteúdo e JSON
Decodifique e codifique os corpos de requisições e respostas.
Codificação de Conteúdo e JSON é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
O protocolo Content
Os modelos do Vapor que trafegam por HTTP estão em conformidade com Content. Content é construído sobre o Codable do Swift e adiciona a capacidade de decodificar corpos de requisição e codificar respostas automaticamente.
import Vapor
struct Todo: Content {
var id: Int?
var title: String
var done: Bool
}Codificando uma resposta como JSON
Retorne qualquer valor Content de um manipulador, e o Vapor o codificará em JSON, definindo automaticamente o cabeçalho Content-Type correto.
app.get("todo") { req -> Todo in
Todo(id: 1, title: "Learn Vapor", done: false)
}Decodificando o corpo de uma requisição
Leia uma carga tipada de uma requisição recebida com req.content.decode(_:). O Vapor examina o Content-Type e analisa JSON (ou dados de formulário) de acordo com o tipo.
app.post("todo") { req -> Todo in
let incoming = try req.content.decode(Todo.self)
return incoming
}Arrays como Content
Coleções de tipos Content são codificadas automaticamente como arrays JSON. Retorne [Todo], e o cliente receberá uma lista JSON.
app.get("todos") { req -> [Todo] in
[Todo(id: 1, title: "A", done: false),
Todo(id: 2, title: "B", done: true)]
}Chaves de codificação personalizadas
Como Content está em conformidade com Codable, você pode mapear nomes de propriedades do Swift para chaves JSON diferentes usando CodingKeys — algo útil para APIs em snake_case.
struct User: Content {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}Configurando o codificador JSON
Você pode definir uma estratégia global de codificação, por exemplo, convertendo todas as chaves para snake_case ou formatando datas como ISO-8601, por meio de ContentConfiguration.
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
encoder.dateEncodingStrategy = .iso8601
ContentConfiguration.global.use(encoder: encoder, for: .json)Validando conteúdo decodificado
O protocolo Validatable do Vapor permite declarar regras de validação. Chame try Todo.validate(content: req) antes de decodificar para rejeitar entradas inválidas com um erro 400 claro.
extension Todo: Validatable {
static func validations(_ v: inout Validations) {
v.add("title", as: String.self, is: !.empty)
}
}Usando validação em um manipulador
Valide primeiro e depois decodifique. Se a validação falhar, o Vapor lançará um erro automaticamente, e o cliente receberá uma resposta de erro descritiva.
app.post("todo") { req -> Todo in
try Todo.validate(content: req)
return try req.content.decode(Todo.self)
}Separando DTOs de requisição e resposta
Uma boa prática é manter tipos distintos para entrada e saída. Por exemplo, um CreateTodo sem identificador para requisições e um Todo completo para respostas. Isso desacopla sua API dos modelos internos.
struct CreateTodo: Content {
var title: String
}
struct TodoResponse: Content {
var id: Int
var title: String
}Codificando strings de consulta
O mesmo mecanismo Content decodifica strings de consulta em uma estrutura por meio de req.query.decode(_:), o que é ideal para parâmetros de filtro e paginação.
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)
}Retornando um status personalizado com Content
Para controlar o corpo e o status, construa uma Response e codifique o conteúdo nela ou retorne uma estrutura semelhante a uma tupla. O exemplo abaixo define o status 201 Criado com um corpo 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
}Verificação rápida: Content e JSON
Teste seus conhecimentos sobre codificação.
Recapitulação: conteúdo e codificação JSON
Você aprendeu como os dados atravessam a rede no Vapor:
- Coloque os modelos em conformidade com
Content(construído sobreCodable). - Retorne conteúdo para codificar JSON; use
req.content.decodepara ler corpos. - Personalize chaves e datas por meio de
CodingKeyseContentConfiguration. - Valide entradas com
Validatablee considere DTOs separados para requisições e respostas.
Perguntas Frequentes
A aula “Codificação de Conteúdo e JSON” é grátis?
Sim — o texto completo de “Codificação de Conteúdo e JSON” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Codificação de Conteúdo e JSON”?
Decodifique e codifique os corpos de requisições e respostas. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Codificação de Conteúdo e JSON”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Roteamento e Tratamento de Requisições
- Codificação de Conteúdo e JSON
- ORM Fluent e Modelos
- Middleware e Autenticação