Alamofire — คืออะไร, HTTP client ใน Swift และทำงานอย่างไร

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-03-07 เวลาอ่าน: 8 นาที

Alamofire เป็นไลบรารี HTTP ยอดนิยมสำหรับ iOS และ macOS เขียนด้วย Swift และสร้างบน URLSession ไลบรารีนี้มีไวยากรณ์แบบประกาศสำหรับคำขอเครือข่าย การจัดการ JSON การอัปโหลดไฟล์ และการจัดการการตรวจสอบสิทธิ์ ตามข้อมูลจาก คลังเก็บ Alamofire บน GitHub (2025) Alamofire มีดาวมากกว่า 42,000 ดวงและถูกใช้โดยโปรเจกต์ iOS หลายพันรายการทั่วโลก

ประเด็นสำคัญ

  • Alamofire เป็นไลบรารี Swift สำหรับคำขอ HTTP ที่สร้างบน URLSession ด้วยไวยากรณ์แบบประกาศ
  • การต่อเนื่องของเมธอด ช่วยให้อธิบายคำขอ พารามิเตอร์ ส่วนหัว และการจัดการตอบสนองได้อย่างกระชับ
  • การรวม Codable กับ responseDecodable จะแปลง JSON เป็นโมเดล Swift โดยอัตโนมัติ
  • ตัวสกัดกั้น RequestInterceptor ช่วยให้การเพิ่มโทเคน การลองใหม่ และการบันทึกข้อมูลง่ายขึ้น
  • การโหลดไฟล์ รองรับความคืบหน้า การหยุดชั่วคราว และการเริ่มต่อผ่านเมธอด download และ upload

Alamofire คืออะไร

Alamofire เป็น HTTP client สำหรับ Swift ที่สร้างโดย Alamofire Software Foundation (เดิมโดย Mattt Thompson ในปี 2014) ไลบรารีนี้ซ่อนรายละเอียดระดับต่ำของ URLSession โดยให้ API ที่สะอาดและสื่อความหมายสำหรับการสื่อสารเครือข่าย

ปรัชญาหลักของ Alamofire คือไวยากรณ์แบบต่อเนื่อง โดยที่พารามิเตอร์คำขอ (URL, เมธอด, ส่วนหัว, พารามิเตอร์, ตัวเข้ารหัส) จะถูกส่งผ่านการเรียกตามลำดับ ซึ่งทำให้โค้ดอ่านง่ายขึ้นและลดโอกาสเกิดข้อผิดพลาดที่เกี่ยวข้องกับการกำหนดค่า URLRequest ที่ไม่ถูกต้อง แนวทางแบบประกาศ ช่วยให้มุ่งเน้นไปที่สิ่งที่ต้องทำแทนที่จะเป็นรายละเอียดของการตั้งค่าการเชื่อมต่อ นักพัฒนาอธิบายผลลัพธ์ที่ต้องการ และไลบรารีจัดการงานเครือข่ายระดับต่ำ

ไลบรารีนี้ได้รับการบำรุงรักษาอย่างแข็งขันตั้งแต่ปี 2014 และผ่านเจ็ดเวอร์ชันหลัก Alamofire 5 ซึ่งปัจจุบันในปี 2025–2026 รวมการสนับสนุน Combine, async/await, ตัวแปลงการตอบสนอง, EventMonitor สำหรับการดีบัก และ RequestInterceptor สำหรับการสกัดกั้นคำขอ แต่ละเวอร์ชันหลักนำการปรับปรุงที่สำคัญ: Alamofire 4 เพิ่มการสนับสนุน Codable, Alamofire 5 เพิ่ม Combine Publishers และระบบการสกัดกั้นคำขอที่ปรับปรุงแล้ว

ระบบนิเวศของ Alamofire ประกอบด้วยไลบรารีเพิ่มเติม: AlamofireImage สำหรับการโหลดและแคชรูปภาพ, AlamofireNetworkActivityIndicator สำหรับตัวบ่งชี้เครือข่ายในแถบสถานะ iOS และ AlamofireObjectMapper สำหรับการรวมกับ ObjectMapper ส่วนประกอบเหล่านี้ทำให้ Alamofire เป็นสแต็กเครือข่ายที่สมบูรณ์ ไม่ใช่แค่ HTTP client

การติดตั้งและตั้งค่า

Alamofire ติดตั้งผ่าน Swift Package Manager (แนะนำ), CocoaPods หรือ Carthage ใน Xcode เพียงเปิดเมนู File → Add Packages วาง URL ของคลังเก็บและระบุเวอร์ชัน

swift
// Swift Package Manager — เพิ่มใน Package.swift
dependencies: [
    .package(url: "https://github.com/Alamofire/Alamofire.git",
             from: "5.9.0")
]

// นำเข้าในไฟล์
import Alamofire

หลังการติดตั้ง Alamofire พร้อมใช้งานทั่วโลกผ่านเนมสเปซ AF(ชื่อย่อของ Alamofire) โดยไม่ต้องกำหนดค่าเพิ่มเติม โปรเจกต์ส่วนใหญ่เริ่มต้นด้วยการกำหนดค่า Session ด้วยการตั้งค่าของตัวเอง — ซึ่งช่วยให้สามารถตั้งค่า URL ฐาน, ส่วนหัวเริ่มต้น, การหมดเวลา และตัวจัดการใบรับรอง TLS

swift
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 30
let session = Session(configuration: configuration)

การสร้างเซสชันที่กำหนดเองผ่าน Session(configuration:) จำเป็นเมื่อต้องการการกำหนดค่าเฉพาะสำหรับส่วนต่าง ๆ ของแอปพลิเคชัน — ตัวอย่างเช่น เซสชันแยกต่างหากสำหรับการดาวน์โหลดรูปภาพด้วยการแคชที่รุนแรง และอีกเซสชันสำหรับคำขอ API ที่มีการตรวจสอบสิทธิ์ Session ของ Alamofire รองรับไม่เพียงแค่การกำหนดค่า แต่ยังรวมถึง interceptor, serverTrustManager, cachedResponseHandler และ redirectHandler ซึ่งให้การควบคุมพฤติกรรมเครือข่ายอย่างสมบูรณ์ในทุกขั้นตอนของคำขอ

คุณสมบัติหลัก

Alamofire มีฟังก์ชันที่หลากหลายครอบคลุมสถานการณ์การโต้ตอบเครือข่ายส่วนใหญ่ในแอปพลิเคชัน iOS มาดูคุณสมบัติหลักกัน

คำขอ HTTP

ไวยากรณ์พื้นฐานของคำขอประกอบด้วยเมธอด, URL, พารามิเตอร์ และการเข้ารหัส เมธอด HTTP มาตรฐานทั้งหมดรองรับผ่าน enum HTTPMethod: get, post, put, patch, delete พารามิเตอร์สามารถเข้ารหัสเป็นพารามิเตอร์ URL (URLEncoding), เนื้อหา JSON (JSONEncoding) หรือข้อมูลหลายส่วน (MultipartFormData)

swift
AF.request("https://api.example.com/users", method: .post,
           parameters: ["name": "Alex", "role": "developer"])
    .validate()
    .responseDecodable(of: User.self) { response in
        switch response.result {
        case .success(let user):
            print("สร้างโดยผู้ใช้: \(user)")
        case .failure(let error):
            print("ข้อผิดพลาด: \(error)")
        }
    }

เมธอด validate() จะตรวจสอบรหัสสถานะ (200–299) และประเภทเนื้อหาโดยอัตโนมัติ ส่งคืนข้อผิดพลาดสำหรับการตอบสนองที่ไม่คาดคิด ซึ่งไม่จำเป็นต้องตรวจสอบ statusCode ด้วยตนเอง responseDecodable ใช้โปรโตคอล Decodable สำหรับการแปลง JSON เป็นโครงสร้าง Swift โดยอัตโนมัติ — ซึ่งช่วยลดการใช้ JSONSerialization ด้วยตนเองและลดโค้ดสำเร็จรูปเมื่อทำงานกับ REST API

การจัดการตอบสนอง

Alamofire รองรับตัวจัดการตอบสนองหลายประเภท: response (ข้อมูลดิบ), responseJSON (พจนานุกรม/อาร์เรย์), responseString (ข้อความ), responseData (Data) และ responseDecodable (โมเดล Decodable) ตัวแปลงการตอบสนอง สามารถกำหนดเองได้ — สำหรับ protobuf, รูปแบบกราฟิก หรือโปรโตคอลที่กำหนดเอง

การอัปโหลดและดาวน์โหลดไฟล์

สำหรับการอัปโหลดข้อมูลไปยังเซิร์ฟเวอร์ ใช้ upload ซึ่งรองรับ Data, File และ MultipartFormData การดาวน์โหลดไฟล์ขนาดใหญ่ทำผ่าน download ด้วยความสามารถในการดำเนินต่อผ่าน resumeData หลังจากถูกขัดจังหวะ การทำงานทั้งสองรองรับการติดตามความคืบหน้าผ่าน uploadProgress และ downloadProgress ด้วยค่าเศษส่วนตั้งแต่ 0 ถึง 1 สำหรับแสดงในส่วนติดต่อผู้ใช้

การอัปโหลดแบบหลายส่วนด้วย Alamofire สะดวกเป็นพิเศษ: เมธอด upload(multipartFormData:) รับ closure ซึ่งส่วนของฟอร์มถูกเพิ่มผ่าน append แต่ละส่วนสามารถมีข้อมูล ไฟล์ หรือสตรีม รวมถึงชื่อและประเภท mime ของตัวเอง Alamofire จะคำนวณขอบเขตแบบหลายส่วนโดยอัตโนมัติและตั้งค่า Content-Type header ที่ถูกต้อง ช่วยไม่ให้นักพัฒนาต้องสร้างเนื้อหาคำขอด้วยตนเอง สำหรับไฟล์ขนาดใหญ่ แนะนำให้ใช้ผู้ให้บริการสตรีมแทนการโหลดไฟล์ทั้งหมดลงในหน่วยความจำ — ซึ่งป้องกันการเกินขีดจำกัดหน่วยความจำบนอุปกรณ์มือถือที่มีทรัพยากรจำกัด สถานการณ์ทั่วไปคือการส่งรูปประจำตัวผู้ใช้พร้อมกับข้อมูลโปรไฟล์ในคำขอแบบหลายส่วนเดียว ซึ่งลดจำนวนการเรียก HTTP และทำให้การประมวลผลฝั่งเซิร์ฟเวอร์ง่ายขึ้น

Alamofire กับ URLSession

การเปรียบเทียบ Alamofire กับ URLSession ดั้งเดิมช่วยในการตัดสินใจทางสถาปัตยกรรม Alamofire ไม่ได้แทนที่ URLSession — มันสร้างอยู่ด้านบนและใช้กลไกการกำหนดค่า การแคช และงานพื้นหลังเดียวกัน คุณสมบัติทั้งหมดของ URLSession สามารถเข้าถึงได้ผ่าน Alamofire แต่มีไวยากรณ์แบบประกาศที่สะดวกกว่า

เกณฑ์AlamofireURLSession
ไวยากรณ์แบบประกาศ, ต่อเนื่องแบบคำสั่ง, closure
การถอดรหัส JSONอัตโนมัติ (responseDecodable)ด้วยตนเอง (JSONSerialization/JSONDecoder)
การตรวจสอบvalidate() — ในตัวตรวจสอบ statusCode ด้วยตนเอง
ความคืบหน้าuploadProgress, downloadProgressผ่าน URLSessionTaskDelegate
ตัวสกัดกั้นRequestInterceptor, EventMonitorตัวแทน, คลาสย่อย
การพึ่งพาต้องติดตั้ง (SPM, CocoaPods)ไม่มี, สร้างใน Foundation

ในโปรเจกต์ขนาดใหญ่ Alamofire ลดโค้ดคำขอเครือข่ายลง 30–50% และทำให้การจัดการข้อผิดพลาดง่ายขึ้น ในโปรเจกต์ขนาดเล็กหรือเมื่อขนาดไบนารีเป็นข้อจำกัดที่เข้มงวด URLSession ดั้งเดิมจะดีกว่าเนื่องจากการไม่มีพึ่งพาภายนอก

Alamofire 5 สมัยใหม่รวมเข้ากับ Combine ผ่านคุณสมบัติ publishDecodable ซึ่งส่งคืน Publisher ทำให้สามารถสร้างห่วงโซ่คำขอแบบรีแอกทีฟพร้อมการจัดการข้อผิดพลาดและการแปลงข้อมูล สำหรับ async/await มีเมธอดที่มีคำต่อท้าย value — ตัวอย่างเช่น AF.request(url).serializingDecodable(User.self).value ทำให้ไวยากรณ์กระชับมากและคล้ายกับการทำงานกับ URLSession ดั้งเดิม เมื่อใช้ async/await ไม่จำเป็นต้องใช้ closure และการจัดการข้อผิดพลาดทำผ่านบล็อก do-catch มาตรฐานของ Swift ซึ่งช่วยให้การบำรุงรักษาโค้ดและการอ่านง่ายขึ้นในระยะยาว

ตัวอย่างโค้ด

มาดูตัวอย่างที่ซับซ้อนมากขึ้น — คำขอที่มีตัวสกัดกั้นซึ่งเพิ่มโทเคนการอนุญาตโดยอัตโนมัติและลองใหม่เมื่อเกิดข้อผิดพลาด 401 นี่เป็นสถานการณ์ทั่วไปสำหรับแอปพลิเคชันที่ใช้การตรวจสอบสิทธิ์ JWT

swift
class AuthInterceptor: RequestInterceptor {
    func adapt(_ urlRequest: URLRequest,
               for session: Session,
               completion: @escaping (Result<URLRequest, Error>) -> Void) {
        var request = urlRequest
        request.setValue("Bearer \(TokenManager.shared.token)",
                         forHTTPHeaderField: "Authorization")
        completion(.success(request))
    }

    func retry(_ request: Request,
              for session: Session,
              dueTo error: Error,
              completion: @escaping (RetryResult) -> Void) {
        guard let response = request.response,
              response.statusCode == 401
        else { return completion(.doNotRetry) }
        TokenManager.shared.refreshToken { success in
            completion(success ? .retry : .doNotRetry)
        }
    }
}

AuthInterceptor ใช้โปรโตคอลสองแบบ: adapt (เพิ่มโทเคนในแต่ละคำขอ) และ retry (พยายามรีเฟรชโทเคนเมื่อเกิดข้อผิดพลาด 401) เมธอด retry จะตรวจสอบรหัสสถานะการตอบสนอง และหากได้รับ 401 จะขอโทเคนใหม่ผ่าน TokenManager หลังจากการรีเฟรชสำเร็จ คำขอจะถูกลองใหม่โดยอัตโนมัติ

การใช้ตัวสกัดกั้นกับเซสชัน:

swift
let session = Session(interceptor: AuthInterceptor())
session.request("https://api.example.com/profile")
    .responseDecodable(of: Profile.self) { response in
        print(response.result)
    }

คำขอทั้งหมดผ่านเซสชันนี้จะผ่าน AuthInterceptor โดยอัตโนมัติ — โทเคนถูกเพิ่มในส่วนหัว และเมื่อ 401 จะมีการรีเฟรชและลองใหม่ ซึ่งช่วยลดการทำซ้ำโค้ดการตรวจสอบสิทธิ์ในทุกคำขอและรวมศูนย์ตรรกะการจัดการโทเคน

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

Alamofire แตกต่างจาก URLSession อย่างไร

Alamofire เป็นตัวห่อหุ้มเหนือ URLSession ด้วยไวยากรณ์แบบประกาศ การตรวจสอบในตัว การถอดรหัส JSON อัตโนมัติ และตัวสกัดกั้น URLSession เป็น API ดั้งเดิมของ Apple โดยไม่มีการพึ่งพา แต่ต้องใช้โค้ดมากกว่าสำหรับงานเดียวกัน Alamofire ลดปริมาณโค้ดเครือข่ายลง 30–50%

วิธีติดตั้ง Alamofire ในโปรเจกต์

วิธีที่แนะนำคือ Swift Package Manager: ใน Xcode เลือก File → Add Packages ป้อน URL https://github.com/Alamofire/Alamofire.git และระบุเวอร์ชัน 5.9.0 ขึ้นไป หรือผ่าน CocoaPods: pod 'Alamofire', '~> 5.9'

Alamofire รองรับ async/await หรือไม่

ใช่ ตั้งแต่ Alamofire 5.5 ได้เพิ่มการสนับสนุน async/await เมธอด request, upload และ download สามารถใช้กับไวยากรณ์ await หรือ Alamofire รวมเข้ากับ Combine โดยการเผยแพร่ค่าผ่าน Publisher

วิธีติดตามความคืบหน้าการดาวน์โหลดใน Alamofire

Alamofire มีเมธอด uploadProgress และ downloadProgress ซึ่งรับ closure พร้อมออบเจ็กต์ Progress ความคืบหน้าส่งคืน fractionCompleted, completedUnitCount และ totalUnitCount ซึ่งสะดวกสำหรับแสดงในส่วนติดต่อผู้ใช้ผ่านแถบความคืบหน้า

สามารถใช้ Alamofire สำหรับการดาวน์โหลดพื้นหลังได้หรือไม่

ใช่ Alamofire รองรับเซสชันพื้นหลังผ่าน URLSessionConfiguration.background มาตรฐาน คุณต้องสร้าง Session ด้วยการกำหนดค่าที่เหมาะสมและลงทะเบียนตัวจัดการเสร็จสิ้นใน AppDelegate DownloadRequest จะทำงานต่อไปแม้หลังจากย่อแอปพลิเคชัน

สรุป

  • Alamofire เป็นไลบรารี Swift สำหรับคำขอ HTTP ด้วยไวยากรณ์แบบต่อเนื่องแบบประกาศบน URLSession
  • การติดตั้ง ผ่าน SPM, CocoaPods หรือ Carthage — เวอร์ชันขั้นต่ำ 5.9.0
  • การตรวจสอบในตัว validate() และ JSONDecoder อัตโนมัติผ่าน responseDecodable ช่วยให้การจัดการตอบสนองง่ายขึ้น
  • RequestInterceptor รวมศูนย์ตรรกะการตรวจสอบสิทธิ์ การลองใหม่ และการบันทึก
  • ความคืบหน้าการดาวน์โหลด พร้อมใช้งานผ่าน uploadProgress และ downloadProgress ด้วยค่าเศษส่วน 0–1
  • การเลือก Alamofire เหมาะสมในโปรเจกต์ที่มีคำขอเครือข่ายจำนวนมากและการจัดการข้อผิดพลาดที่ซับซ้อน

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม