Kodowanie treści i JSON
Dekodowanie i kodowanie treści żądań oraz odpowiedzi.
Kodowanie treści i JSON to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Protokół Content
Modele Vapor przesyłane przez HTTP implementują protokół Content. Content opiera się na protokole Swift Codable, dodając możliwość automatycznego dekodowania z treści żądań i kodowania w odpowiedziach.
import Vapor
struct Todo: Content {
var id: Int?
var title: String
var done: Bool
}Kodowanie odpowiedzi jako JSON
Zwróćcie Państwo dowolną wartość typu Content z handlera, a Vapor zakoduje ją do formatu JSON i samodzielnie ustawi właściwy nagłówek Content-Type.
app.get("todo") { req -> Todo in
Todo(id: 1, title: "Learn Vapor", done: false)
}Dekodowanie treści żądania
Odczytajcie Państwo typowany ładunek z przychodzącego żądania za pomocą req.content.decode(_:). Vapor analizuje nagłówek Content-Type i odpowiednio przetwarza JSON (lub dane formularza).
app.post("todo") { req -> Todo in
let incoming = try req.content.decode(Todo.self)
return incoming
}Tablice jako Content
Kolekcje typów Content są automatycznie kodowane jako tablice JSON. Zwróćcie Państwo [Todo], a klient otrzyma listę JSON.
app.get("todos") { req -> [Todo] in
[Todo(id: 1, title: "A", done: false),
Todo(id: 2, title: "B", done: true)]
}Niestandardowe klucze kodowania
Ponieważ Content implementuje Codable, mogą Państwo mapować nazwy właściwości Swift na inne klucze JSON za pomocą CodingKeys — jest to przydatne w interfejsach API używających snake_case.
struct User: Content {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}Konfigurowanie kodera JSON
Mogą Państwo ustawić globalną strategię kodowania, na przykład konwertowanie wszystkich kluczy do snake_case lub formatowanie dat jako ISO-8601, za pomocą ContentConfiguration.
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
encoder.dateEncodingStrategy = .iso8601
ContentConfiguration.global.use(encoder: encoder, for: .json)Walidowanie zdekodowanej zawartości
Protokół Validatable Vapor pozwala deklarować reguły walidacji. Wywołajcie Państwo try Todo.validate(content: req) przed dekodowaniem, aby odrzucać nieprawidłowe dane z czytelnym błędem 400.
extension Todo: Validatable {
static func validations(_ v: inout Validations) {
v.add("title", as: String.self, is: !.empty)
}
}Używanie walidacji w handlerze
Najpierw wykonajcie walidację, a następnie dekodujcie dane. Jeśli walidacja się nie powiedzie, Vapor automatycznie zgłosi błąd, a klient otrzyma opisową odpowiedź z błędem.
app.post("todo") { req -> Todo in
try Todo.validate(content: req)
return try req.content.decode(Todo.self)
}Oddzielne DTO żądania i odpowiedzi
Dobrą praktyką jest przechowywanie oddzielnych typów danych wejściowych i wyjściowych. Na przykład CreateTodo bez identyfikatora na potrzeby żądań oraz pełnego typu Todo na potrzeby odpowiedzi. Rozdziela to API od modeli wewnętrznych.
struct CreateTodo: Content {
var title: String
}
struct TodoResponse: Content {
var id: Int
var title: String
}Kodowanie ciągów zapytań
Ten sam mechanizm Content dekoduje ciągi zapytań do struktury za pomocą req.query.decode(_:), co doskonale sprawdza się w przypadku parametrów filtrowania i stronicowania.
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)
}Zwracanie niestandardowego statusu z zawartością
Aby kontrolować zarówno treść, jak i status, zbudujcie Państwo obiekt Response i zakodujcie w nim zawartość albo zwróćcie konstrukcję przypominającą krotkę. Poniższy przykład ustawia status 201 Created i treść 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
}Szybki test: Content i JSON
Sprawdźcie Państwo swoją wiedzę o kodowaniu.
Podsumowanie: Content i kodowanie JSON
Nauczyli się Państwo, jak dane są przesyłane w Vapor:
- Modele powinny implementować
Content(oparty naCodable). - Zwracać zawartość, aby zakodować JSON, oraz używać
req.content.decodedo odczytywania treści żądań. - Dostosowywać klucze i daty za pomocą
CodingKeysorazContentConfiguration. - Weryfikować dane wejściowe za pomocą
Validatablei rozważyć oddzielne DTO żądań i odpowiedzi.
Często zadawane pytania
Czy lekcja „Kodowanie treści i JSON” jest bezpłatna?
Tak — pełny tekst „Kodowanie treści i JSON” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Kodowanie treści i JSON”?
Dekodowanie i kodowanie treści żądań oraz odpowiedzi. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Kodowanie treści i JSON”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Routing i obsługa żądań
- Kodowanie treści i JSON
- Fluent ORM i modele
- Middleware i uwierzytelnianie