0Pricing
Swift Academy · บทเรียน

การเข้ารหัสเนื้อหาและ JSON

ถอดรหัสและเข้ารหัสเนื้อหาของคำขอและการตอบกลับ

การเข้ารหัสเนื้อหาและ JSON เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

โพรโทคอลเนื้อหา

โมเดลของ 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 จะถูกเข้ารหัสเป็นอาร์เรย์ 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 ที่ใช้ชื่อแบบคั่นคำด้วยขีดล่าง

struct User: Content {
    var firstName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
    }
}

การกำหนดค่าเครื่องมือเข้ารหัส JSON

คุณสามารถกำหนดกลยุทธ์การเข้ารหัสทั่วทั้งแอป เช่น เปลี่ยนคีย์ทั้งหมดเป็นรูปแบบชื่อที่คั่นคำด้วยขีดล่าง หรือจัดรูปแบบวันที่เป็น ISO-8601 ผ่าน ContentConfiguration ได้

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 ที่ไม่มี id สำหรับคำขอ และใช้ 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
}

ตรวจสอบอย่างรวดเร็ว: เนื้อหาและ JSON

ตรวจสอบความรู้เกี่ยวกับการเข้ารหัสของคุณ

สรุป: การเข้ารหัสเนื้อหาและ JSON

คุณได้เรียนรู้แล้วว่าข้อมูลเดินทางผ่านเครือข่ายใน Vapor อย่างไร:

  • ทำให้โมเดลสอดคล้องกับ Content ซึ่งสร้างบน Codable
  • ส่งคืนเนื้อหาเพื่อเข้ารหัสเป็น JSON และใช้ req.content.decode เพื่ออ่านเนื้อหาคำขอ
  • ปรับแต่งคีย์และวันที่ผ่าน CodingKeys และ ContentConfiguration
  • ตรวจสอบข้อมูลขาเข้าด้วย Validatable และพิจารณาใช้ DTO ของคำขอและการตอบกลับแยกกัน

คำถามที่พบบ่อย

บทเรียน “การเข้ารหัสเนื้อหาและ JSON” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเข้ารหัสเนื้อหาและ JSON” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเข้ารหัสเนื้อหาและ JSON”

ถอดรหัสและเข้ารหัสเนื้อหาของคำขอและการตอบกลับ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเข้ารหัสเนื้อหาและ JSON” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดเส้นทางและจัดการคำขอ
  2. การเข้ารหัสเนื้อหาและ JSON
  3. ORM และโมเดลแบบ Fluent
  4. มิดเดิลแวร์และการยืนยันตัวตน
← กลับไปที่ Swift Academy