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

URLSession data(from:) พร้อม async/await

ดึงข้อมูลแบบอะซิงโครนัสจาก REST API ด้วย API สมัยใหม่ของ URLSession

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

API สมัยใหม่ของ URLSession

Swift 5.5 ขึ้นไปรองรับโอเวอร์โหลดแบบอะซิงโครนัสบน URLSession เช่น data(from:delegate:) ซึ่งจะระงับการทำงานแทนการใช้โคลแบ็ก

let (data, response) = try await URLSession.shared.data(from: URL(string: "https://api.example.com/items")!)

ฟังก์ชันดึงข้อมูลฉบับสมบูรณ์

ห่อการเรียกใช้ไว้ในฟังก์ชันแบบอะซิงโครนัสที่ส่งข้อผิดพลาดได้ เพื่อให้ประกอบใช้งานและทดสอบได้

func fetchItems() async throws -> [Item] {
  let url = URL(string: "https://api.example.com/items")!
  let (data, _) = try await URLSession.shared.data(from: url)
  return try JSONDecoder().decode([Item].self, from: data)
}

การเรียกจาก SwiftUI

เรียกฟังก์ชันแบบอะซิงโครนัสจากตัวปรับแต่ง .task หรือจาก Task { } ภายในการทำงานของปุ่ม

struct ItemList: View {
  @State private var items: [Item] = []
  var body: some View {
    List(items, id: \.id) { Text($0.name) }
      .task { items = (try? await fetchItems()) ?? [] }
  }
}

URLRequest สำหรับส่วนหัวแบบกำหนดเอง

สร้าง URLRequest พร้อมเมธอด ส่วนหัว และเนื้อหา จากนั้นส่งให้กับ data(for:)

var request = URLRequest(url: URL(string: "https://api.example.com/login")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(LoginBody(email: "a@b.com", password: "pass"))
let (data, _) = try await URLSession.shared.data(for: request)

การตรวจสอบสถานะ HTTP

แปลงการตอบกลับเป็น HTTPURLResponse และตรวจสอบรหัสสถานะก่อนถอดรหัส

let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
  throw URLError(.badServerResponse)
}
let item = try JSONDecoder().decode(Item.self, from: data)

การยกเลิก

การยกเลิก Task แม่จะยกเลิกคำขอ URLSession ที่กำลังดำเนินการอยู่โดยอัตโนมัติ

let task = Task {
  let items = try await fetchItems()
  // ...
}
task.cancel() // cancels URLSession request if in-flight

การอัปโหลดข้อมูล

ใช้ upload(for:from:) เพื่อส่งข้อมูลไบนารีหรือข้อมูลแบบฟอร์มด้วย POST แบบอะซิงโครนัส

var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let (data, _) = try await URLSession.shared.upload(for: request, from: imageData)

การดาวน์โหลดไฟล์

download(from:) จะดาวน์โหลดไฟล์ไปยัง URL ชั่วคราวบนดิสก์ แทนการโหลดเข้าไปในหน่วยความจำ

let (fileURL, _) = try await URLSession.shared.download(from: remoteURL)
let destURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("file.pdf")
try FileManager.default.moveItem(at: fileURL, to: destURL)

การกำหนดค่า URLSession แบบกำหนดเอง

สร้างเซสชันแบบกำหนดเองพร้อมระยะหมดเวลา นโยบายแคช และการรองรับการทำงานเบื้องหลัง

let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30
config.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: config)

bytes แบบอะซิงโครนัสสำหรับการสตรีม

ใช้ bytes(from:) เพื่อสตรีมข้อมูลการตอบกลับทีละบรรทัดโดยไม่ต้องเก็บการตอบกลับทั้งหมดไว้ในบัฟเฟอร์

let (stream, _) = try await URLSession.shared.bytes(from: url)
for try await line in stream.lines {
  print(line)
}

การทดสอบด้วย URLProtocol

จำลองการตอบกลับเครือข่ายในการทดสอบโดยสืบทอดจาก URLProtocol และฉีดเข้าไปในการกำหนดค่าเซสชันแบบกำหนดเอง

class MockURLProtocol: URLProtocol {
  static var requestHandler: ((URLRequest) throws -> (HTTPURLResponse, Data))?
  // override canInit, startLoading, stopLoading
}

ตรวจสอบความเข้าใจ

เมธอด URLSession แบบอะซิงโครนัสใดที่ดาวน์โหลดการตอบกลับจาก URL ไปยังไฟล์ชั่วคราวบนดิสก์โดยตรง

ทบทวนบทเรียน

ใช้ URLSession.shared.data(from:) สำหรับคำขอ GET แบบอะซิงโครนัส ใช้ data(for:) พร้อม URLRequest แบบกำหนดเองสำหรับ POST หรือ PUT ใช้ download(from:) สำหรับการดาวน์โหลดไฟล์ และใช้ bytes(from:) สำหรับการสตรีม ตรวจสอบรหัสสถานะ HTTP ก่อนถอดรหัสเสมอ

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

บทเรียน “URLSession data(from:) พร้อม async/await” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “URLSession data(from:) พร้อม async/await”

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

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

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

บทเรียน “URLSession data(from:) พร้อม async/await” ใช้เวลานานแค่ไหน

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

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

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

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

  1. URLSession data(from:) พร้อม async/await
  2. Codable: การเข้ารหัสและถอดรหัส JSON
  3. การจัดการข้อผิดพลาดและรหัสสถานะ HTTP
  4. ตรรกะการลองใหม่และ URLSession เบื้องหลัง
← กลับไปที่ Swift Academy