Alamofire เป็น HTTP-client สำหรับ iOS, macOS, tvOS และ watchOS ที่เขียนด้วยภาษา Swift ไลบรารีนี้จะทำงานอัตโนมัติในการเข้ารหัสพารามิเตอร์ การตรวจสอบความถูกต้องของการตอบกลับ และการทำให้ข้อมูลเป็นลำดับ ตามข้อมูลของ พื้นที่เก็บ Alamofire บน GitHub โปรเจกต์นี้ถูกใช้โดย กว่า 40,000 แอปพลิเคชันทั่วโลก Alamofire ถือเป็นมาตรฐานโดยพฤตินัยสำหรับการสื่อสารเครือข่ายในระบบนิเวศของ Apple
ประเด็นสำคัญ
Alamofire เป็นไลบรารีสำหรับทำงานกับคำขอ HTTP บนแพลตฟอร์ม Apple ที่เขียนด้วย Swift ทั้งหมด การพัฒนาเริ่มขึ้นในปี 2014 เพื่อเป็นทางเลือกแทนไลบรารี AFNetworking ใน Objective-C และกลายเป็นมาตรฐานสำหรับการสื่อสารเครือข่ายในชุมชน iOS อย่างรวดเร็ว
ไลบรารีสร้างขึ้นบนเฟรมเวิร์กระบบ URLSession โดยแยก API ระดับต่ำออกเป็นลูกโซ่เมธอดที่กระชับ Alamofire รองรับฟีเจอร์ทั้งหมดของ URLSession: เซสชันพื้นหลัง ตัวสกัดกั้นคำขอ ใบรับรอง SSL และวิธีการทำให้การตอบกลับเป็นลำดับหลายวิธี
ตาม Swift Package Index Alamofire อยู่ใน 10 แพ็คเกจ Swift ยอดนิยมที่มีดาวมากกว่า 45,000 ดาวบน GitHub ไลบรารีนี้เข้ากันได้กับ iOS 10+, macOS 10.12+, tvOS 10+ และ watchOS 3+
ข้อได้เปรียบหลักของ Alamofire เมื่อเทียบกับการใช้ URLSession โดยตรงคือ การลดโค้ดส่วนหัวที่ซ้ำซาก การเรียก AF.request เพียงครั้งเดียวแทนที่การกำหนดค่า URLSession ด้วยตนเอง การจัดการการตอบกลับ และการถอดรหัสข้อมูลจำนวน 15–20 บรรทัด ในขณะเดียวกัน ไลบรารียังคงความยืดหยุ่นอย่างเต็มที่สำหรับสถานการณ์ที่กำหนดเองผ่านเซสชันและส่วนขยายที่กำหนดเอง
Alamofire มีฟังก์ชันเครือข่ายที่หลากหลายครอบคลุมสถานการณ์การพัฒนาแอปบนมือถือส่วนใหญ่ ด้วยสถาปัตยกรรมแบบโมดูลาร์ นักพัฒนาจำเป็นต้องรวมเฉพาะส่วนประกอบที่จำเป็นเท่านั้น
เมธอด HTTP GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS และ TRACE ถูกนำมาใช้ผ่าน API ที่เป็นหนึ่งเดียวกัน แต่ละเมธอดรับพารามิเตอร์คำขอ ส่วนหัว และส่งคืนการตอบกลับเป็นชนิด Result นักพัฒนาไม่ต้องกำหนดค่า URLSession ด้วยตนเอง — ไลบรารีจะทำโดยอัตโนมัติตามอาร์กิวเมนต์ที่ให้มา
การตรวจสอบ การตอบกลับใน Alamofire ช่วยให้ตรวจสอบรหัสสถานะและเนื้อหาการตอบกลับก่อนส่งข้อมูลไปยังแอปพลิเคชัน ไลบรารีรองรับเงื่อนไขการตรวจสอบที่กำหนดเองผ่าน closures ให้การควบคุมการจัดการข้อผิดพลาดอย่างเต็มที่ โดยค่าเริ่มต้น จะตรวจสอบเฉพาะรหัสสถานะ 200–299 เท่านั้น
พารามิเตอร์ จะถูกเข้ารหัสโดยอัตโนมัติขึ้นอยู่กับชนิดที่เลือก: การเข้ารหัส URL สำหรับคำขอ GET และการเข้ารหัส JSON สำหรับ POST Alamofire ยังรองรับการเข้ารหัส Property List และตัวเข้ารหัสที่กำหนดเองผ่านโปรโตคอล ParameterEncoder ซึ่งช่วยให้ปรับรูปแบบให้เข้ากับเซิร์ฟเวอร์ใดก็ได้
เซสชัน ใน Alamofire ช่วยให้กำหนดค่ากำหนดเวลา ใบรับรอง SSL ส่วนหัว HTTP เริ่มต้น และพร็อกซี ตัวสกัดกั้น EventMonitor ช่วยให้ติดตามเหตุการณ์ในวงจรชีวิตของคำขอ: การสร้าง การส่ง การรับการตอบกลับ และการเสร็จสิ้น ซึ่งมีประโยชน์สำหรับการบันทึก วิเคราะห์ และแก้ไขปัญหาเครือข่ายในการผลิต
Alamofire ใช้สถาปัตยกรรมแบบ Session ที่ห่อหุ้มอินสแตนซ์ URLSession และการกำหนดค่าเครือข่าย แต่ละคำขอจะผ่านลูกโซ่ของตัวจัดการ: อะแดปเตอร์ นโยบายการลองใหม่ ตัวตรวจสอบความถูกต้อง และตัวทำให้เป็นลำดับ ซึ่งรับประกันความยืดหยุ่นและการขยายได้
ออบเจกต์ Session จัดการคำขอเครือข่ายทั้งหมดในแอปพลิเคชัน มันถูกสร้างขึ้นด้วยการกำหนดค่าที่มีกำหนดเวลา ส่วนหัวเริ่มต้น และใบรับรอง แต่ละการเรียก AF.request จะส่งคืน DataRequest ที่สามารถแก้ไขได้ก่อนส่ง Alamofire จัดการวงจรการคงอยู่โดยอัตโนมัติผ่านการอ้างอิงที่อ่อนแอไปยังเซสชัน ป้องกันการรั่วไหลของหน่วยความจำ
import Alamofire
let session = Session(configuration: config)
session.request("https://api.example.com/users")
.validate()
.responseDecodable(of: [User].self) { response in
switch response.result {
case .success(let users):
print("ได้รับ \(users.count) ผู้ใช้")
case .failure(let error):
print("ข้อผิดพลาด: \(error.localizedDescription)")
}
}
การติดตั้ง Alamofire ทำได้ผ่าน Swift Package Manager, CocoaPods หรือ Carthage วิธีที่แนะนำสำหรับโปรเจกต์ใหม่คือ SPM ซึ่งรวมอยู่ใน Xcode เนื่องจากไม่ต้องใช้เครื่องมือเพิ่มเติมและการบูรณาการทำได้ในไม่กี่คลิก
การเพิ่ม แพ็คเกจ ใน Xcode ทำได้ผ่านเมนู File → Add Packages URL พื้นที่เก็บ: https://github.com/Alamofire/Alamofire แนะนำให้กำหนดรุ่นเป็นรุ่นเสถียรล่าสุด Alamofire ปฏิบัติตามการกำหนดรุ่นแบบความหมาย และการเปลี่ยนแปลงที่สำคัญทั้งหมดจะถูกบันทึกใน CHANGELOG
CocoaPods ยังคงเป็นตัวเลือกยอดนิยมสำหรับโปรเจกต์ที่มีโครงสร้างพื้นฐานอยู่แล้ว เพิ่มบรรทัด pod 'Alamofire' ลงใน Podfile ของคุณแล้วรัน pod install Alamofire ไม่มีการพึ่งพาภายนอก ซึ่งช่วยลดความซับซ้อนในการบูรณาการและขจัดความขัดแย้งของรุ่นในโปรเจกต์ที่มีอยู่
ตัวอย่าง ด้านล่างแสดงสถานการณ์การใช้งาน Alamofire ทั่วไปในแอปพลิเคชัน iOS: ตั้งแต่คำขอ GET ธรรมดาไปจนถึงการอัปโหลดไฟล์พร้อมการติดตามความคืบหน้า
คำขอ GET อย่างง่ายพร้อมพารามิเตอร์และการถอดรหัสการตอบกลับเป็นโมเดล Codable เป็นสถานการณ์การใช้งาน Alamofire ที่พบบ่อยที่สุดในแอปพลิเคชันมือถือ พารามิเตอร์จะถูกเข้ารหัสโดยอัตโนมัติและการตอบกลับจะถูกถอดรหัสผ่าน JSONDecoder โค้ดกระชับและอ่านง่าย
struct User: Codable {
let id: Int
let name: String
let email: String
}
AF.request("https://jsonplaceholder.typicode.com/users",
method: .get)
.validate()
.responseDecodable(of: [User].self) { response in
switch response.result {
case .success(let users):
print("ผู้ใช้: \(users.count)")
case .failure(let error):
print("ข้อผิดพลาด: \(error)")
}
}
คำขอ POST พร้อมเนื้อหา JSON ใช้สำหรับสร้างทรัพยากรบนเซิร์ฟเวอร์ Alamofire จะเข้ารหัสออบเจกต์ที่ส่งผ่านโดยอัตโนมัติผ่าน JSONParameterEncoder ช่วยประหยัดนักพัฒนาจากการทำให้เป็นลำดับด้วยตนเอง การตอบกลับจะถูกถอดรหัสเป็นโมเดลข้อมูลโดยใช้ JSONDecoder เดียวกัน
let newUser = User(id: 1,
name: "สมชาย ใจดี",
email: "ivan@example.com")
AF.request("https://jsonplaceholder.typicode.com/users",
method: .post,
parameters: newUser,
encoder: JSONParameterEncoder.default)
.validate()
.responseDecodable(of: User.self) { response in
if let created = response.value {
print("สร้างผู้ใช้แล้ว: \(created)")
}
}
เมธอด upload ใน Alamofire รองรับการอัปโหลดไฟล์ ข้อมูล และฟอร์มหลายส่วน ไลบรารีจัดการความคืบหน้าโดยอัตโนมัติและช่วยให้ติดตามสถานะการอัปโหลดผ่าน closures uploadProgress ซึ่งสะดวกสำหรับการแสดงตัวบ่งชี้ความคืบหน้า
let imageData = UIImage(named: "photo")?.jpegData(compressionQuality: 0.8)
AF.upload(imageData,
to: "https://api.example.com/upload")
.uploadProgress { progress in
print("ความคืบหน้า: \(progress.fractionCompleted * 100)%")
}
.responseDecodable(of: UploadResponse.self) { response in
print("อัปโหลดเสร็จสมบูรณ์")
}
การจัดการ ข้อผิดพลาดใน Alamofire สร้างขึ้นจากการรวมกันของการตรวจสอบความถูกต้องของการตอบกลับและชนิด Result โมเดลข้อผิดพลาดประกอบด้วย AFError ซึ่งครอบคลุมสถานการณ์ความล้มเหลวของเครือข่ายทั่วไปทั้งหมด: หมดเวลา สูญเสียการเชื่อมต่อ ข้อผิดพลาดของเซิร์ฟเวอร์ และการทำให้เป็นลำดับล้มเหลว แต่ละกรณีจะถูกจัดการแยกกัน
สำหรับการลองใหม่หลังจากข้อผิดพลาด Alamofire มีกลไก RequestRetrier โปรโตคอลนี้กำหนดนโยบายการลองใหม่: จำนวนครั้งที่ลอง หน่วงเวลาระหว่างครั้ง และเงื่อนไขที่ทำการลองใหม่ ตัวอย่างเช่น เมื่อเกิดข้อผิดพลาด 503 ของเซิร์ฟเวอร์ สามารถลองคำขอใหม่หลังจาก 2 วินาที ในขณะที่ข้อผิดพลาด 401 สามารถขอโทเคนการรับรองความถูกต้องใหม่
วิธีการ AFError แบบแจงนับรับประกันว่านักพัฒนาจะไม่พลาดข้อผิดพลาดชนิดใด — คอมไพเลอร์ตรวจสอบความสมบูรณ์ของการจัดการ ทำให้โค้ดมีความน่าเชื่อถือและคาดเดาได้มากขึ้นเมื่อเทียบกับการจัดการข้อผิดพลาดผ่าน NSError ใน URLSession ดิบ
โปรโตคอล RequestRetrier กำหนดเมธอดลองใหม่ที่รับคำขอ เซสชัน ข้อผิดพลาด และ closure เสร็จสมบูรณ์ ในเมธอดนี้ นักพัฒนาจะตัดสินใจว่าจะลองคำขอใหม่หรือไม่และหลังจากหน่วงเวลาเท่าใด Alamofire มีการใช้งาน RetryPolicy ในตัวสำหรับสถานการณ์ทั่วไป แต่สำหรับโค้ดในระบบผลิต ขอแนะนำให้สร้างนโยบายที่กำหนดเองตามตรรกะทางธุรกิจ
AFError เป็นการแจงนับที่มีกรณีซ้อนสำหรับหมวดหมู่ข้อผิดพลาดต่างๆ นักพัฒนาสามารถจัดการแต่ละชนิดแยกกัน: สำหรับการหมดเวลา — ลองคำขอใหม่, สำหรับข้อผิดพลาดของเซิร์ฟเวอร์ — แสดงข้อความที่เข้าใจได้แก่ผู้ใช้ Alamofire รองรับนโยบายการลองใหม่ที่กำหนดเองผ่านโปรโตคอล RequestRetrier
การตรวจสอบ ในตัวจะตรวจสอบรหัสสถานะในช่วง 200–299 และชนิดเนื้อหาของการตอบกลับ สำหรับการตรวจสอบเพิ่มเติม สามารถเพิ่มเงื่อนไขที่กำหนดเองผ่าน closure validate ซึ่งช่วยให้ตรวจสอบตรรกะทางธุรกิจก่อนส่งข้อมูลไปยังชั้น UI
คำถามที่พบบ่อย
Alamofire มี API ระดับสูงกว่าเมื่อเทียบกับ URLSession ไลบรารีทำงานอัตโนมัติในการเข้ารหัสพารามิเตอร์ การตรวจสอบการตอบกลับ และการทำให้ข้อมูลเป็นลำดับ ในขณะที่ URLSession ต้องการการกำหนดค่าด้วยตนเองของแต่ละส่วนประกอบของคำขอเครือข่าย
ได้ Alamofire เข้ากันได้อย่างสมบูรณ์กับ SwiftUI โดยทั่วไปคำขอจะดำเนินการภายใน ObservableObject หรือผ่าน async/awat โดยใช้ Task Alamofire ไม่พึ่งพา UIKit ดังนั้นจึงทำงานได้ดีในแอปพลิเคชัน SwiftUI สมัยใหม่
ทางเลือกหลักของ Alamofire คือ: URLSession ในตัว, Moya (ชั้นเหนือ Alamofire พร้อมการแยก API), Networking โดย FreshOS และ Apollo GraphQL สำหรับทำงานกับเซิร์ฟเวอร์ GraphQL การเลือกขึ้นอยู่กับสถาปัตยกรรมของโปรเจกต์
Alamofire มีการบูรณาการในตัวกับ Combine ผ่านส่วนขยาย Publishers และรองรับ Swift Concurrency ผ่าน async/await ซึ่งช่วยให้เลือกวิธีการประมวลผลแบบอะซิงโครนัสที่ทันสมัยได้
การหมดเวลา กำหนดค่าผ่านการกำหนดค่า Session ตั้งค่าคุณสมบัติ timeoutIntervalForRequest และ timeoutIntervalForResource เมื่อสร้าง URLSessionConfiguration จากนั้นส่งต่อไปยังตัวเริ่มต้น Session ค่าเริ่มต้นคือ 60 วินาที
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ