Hướng dẫn Parse Json từ API sử dụng Alamofire
Trong khuôn khổ bài viết ngày hôm này, mình sẽ giới thiệu cho các bạn cách sử dụng Alamofire để tương tác với API , đồng thời sẽ giới thiệu sơ lược về các HTTPMethod như là POST ,PUT, GET, DELETE .... . Vì vậy nên những phần xử lý Json mình sẽ viết trong một bài viết khác, còn bài viết này sẽ giới thiệu cho các bạn cách sử dụng Alamofire
Cài đặt Alamofire
Đầu tiên ta sẽ cập nhật lại Podfile.
target' < Your Target Name >'do
pod ' Alamofire ', '~> 4.4'
end
Với Alamofire 4.x thì yêu cầu bạn phải cập nhật CocoaPods 1.1.0+
Sử dụng lệnh :$ gem install cocoapods
Tạo Request đến API
Alamofire cho chúng ta 3 method gửi request đến endPoint, thì 2 method request đầu tiên là loại method default , có nghĩa là nó cho phép chúng ta truyền vào chuỗi URL và HTTP Method của nó mặc định cũng là GET
Vì vậy ở đây mình sẽ sử dụng method request thứ 3, với đầy đủ các Parameter một cách tường minh.
Alamofire.request(<url: URLConvertible>, method: <HTTPMethod>, parameters: <Parameters>, encoding: <ParameterEncoding>, headers: <HTTPHeaders>)
Mình sẽ giải thích những parameter trong method request này :
url : là URL của API mà mình muốn tương tác
method : Alamofire cung cấp cho chúng ta nhiều loại HTTPMethod như là .post .get .put .delete .option....
parameter : đây là những parameter mà API bắt buộc khi chúng ta tạo request đến API, nếu không có ta có thể để nó là nil
encoding : Alamofire hỗ trợ 3 dạng encoding là URL , JSON , Property List ngoài ra chúng ta có thể thêm những custom encoding bằng cách sử dụng Protocol.
header : tương tự như parameter , nếu API bắt buộc phải có header thì chúng ta phải truyền vào, nếu không có thì để nil
GET Request
let todoEndpoint: String = "https://jsonplaceholder.typicode.com/todos/1"
Alamofire.request(todoEndpoint, method: .get)
.responseJSON { response in
// ...
}
Sau khi tạo request đến API với đầy đủ các param, API sẽ trả data về , từ đây chúng ta sẽ handle những data đó theo mục đích của ta.
Alamofire có hỗ trợ chúng ta những method để handle những data response từ API như : response, responseData , responseString, responseJSON, responsePropertyList. Tuỳ theo data response từ API mà chúng ta sẽ dùng kiểu method cho phù hợp. Thông thường mình sử dụng responseJSON , vì thường API trả về data rất nhiểu kiểu, vì vậy sử dụng responseJSON để handle kiểu Any
// Response Handler - Unserialized Response
func response(
queue: DispatchQueue?,
completionHandler: @escaping (DefaultDataResponse) -> Void)
-> Self
// Response Data Handler - Serialized into Data
func responseData(
queue: DispatchQueue?,
completionHandler: @escaping (DataResponse<Data>) -> Void)
-> Self
// Response String Handler - Serialized into String
func responseString(
queue: DispatchQueue?,
encoding: String.Encoding?,
completionHandler: @escaping (DataResponse<String>) -> Void)
-> Self
// Response JSON Handler - Serialized into Any
func responseJSON(
queue: DispatchQueue?,
completionHandler: @escaping (DataResponse<Any>) -> Void)
-> Self
// Response PropertyList (plist) Handler - Serialized into Any
func responsePropertyList(
queue: DispatchQueue?,
completionHandler: @escaping (DataResponse<Any>) -> Void))
-> Self
POST Request
Với phương thức Post ta có thể có thêm 2 param là Parameter và Header, tuỳ vào API yêu cầu.
let parameters : [String : Any] = [
"password" : "123456",
"user_account" : "hunghandsome"
]
let header : [String : String] = [
"Authorization" : user.user_token ?? ""
]
Alamofire.request(URLs.changePassword, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: header)
.responseJSON {
Một số HTTPRequest khác
Alamofire đã support cho chúng ta khá nhiều phương thức như bên dưới, để hiểu rõ hơn các bạn có thể vào link github của Alamofire theo đường link sau , để tìm hiểu kỹ hơn.
https://github.com/Alamofire/Alamofire#installation
Nhưng HTTPMethod của Alamofire:
public enum HTTPMethod: String {
case options = "OPTIONS"
case get = "GET"
case head = "HEAD"
case post = "POST"
case put = "PUT"
case patch = "PATCH"
case delete = "DELETE"
case trace = "TRACE"
case connect = "CONNECT"
}
Dưới đây là một ví dụ của phương thức delete của Alamofire
let firstTodoEndpoint: String = "https://jsonplaceholder.typicode.com/todos/1"
Alamofire.request(firstTodoEndpoint, method: .delete)
.responseJSON { response in
guard response.result.error == nil else {
// got an error in getting the data, need to handle it
print("error calling DELETE on /todos/1")
print(response.result.error!)
return
}
print("DELETE ok")
}
Response Handler
Sau khi data đã trả về từ API thì khi đó sẽ có 2 trường hợp xảy ra Thành công( có data) hoặc Thất bại(có lỗi), để handle được những trường hợp xảy ra ta sẽ làm theo cách sau :
let parameters : [String : Any] = [
"password" : "123456",
"user_account" : "hunghandsome"
]
let header : [String : String] = [
"Authorization" : user.user_token ?? ""
]
Alamofire.request(URLs.changePassword, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: header)
.responseJSON {
responseData in
guard let json = responseData.result.value as? [String: Any] else {
print("didn't get todo object as JSON from API")
print("Error: \(response.result.error)")
return
}
print(json)
}
ngoài ra Alamofire còn hỗ trợ chúng ta với method isSuccess để handle khi có lỗi xảy ra.
guard responseData.result.isSuccess else {
// handle failure
return
}
// handle success
}
và
guard response.result.error == nil else {
// got an error in getting the data, need to handle it
print("error calling GET on /todos/1")
print(response.result.error!)
return
}
Validation Response
Mỗi result trả về sẽ chứa Value và Type, vì vậy để biết được kết quả trả về có lỗi hay không chúng ta có thể valid theo 2 cách như sau :
Manual Validation
Alamofire.request("https://httpbin.org/get")
.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"])
.responseData { response in
switch response.result {
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
}
}
Và kết quả trả về có HTTP Code từ 200 đến 299 thì có nghĩa là nó success , và chúng ta có thể điều chỉnh statusCode theo những khoảng mà chúng ta muốn với những mục đích khác
Automatic Validation
Alamofire.request("https://httpbin.org/get").validate().responseJSON { response in
switch response.result {
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
}
}
Với cách sử dụng hàm .validate() thì mặc định statusCode sẽ là 200 ... 299 và Content Type header của response sẽ trùng với Accept header của request ban đầu thì mới đúng.
Upload Data to a Server
Trong phần này , Với Alamofire chúng ta có thể :
- Uploading Data
- Uploading a File
- Uploading Multipart Form Data
1.Uploading Data
Alamofire.upload(imageData, to: "https://httpbin.org/post").responseJSON { response in
debugPrint(response)
}
2.Uploading a File
Alamofire.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in
debugPrint(response)
}
3. Uploading Multipart Form Data
multipartFormData: { multipartFormData in
multipartFormData.append(imageData,
withName: "imagefile",
fileName: "image.jpg",
mimeType: "image/jpeg")
},
to: "http://api.imagga.com/v1/content",
headers: ["Authorization": "Basic xxx"],
encodingCompletion: { encodingResult in
}
)
Người viết : Nguyễn Khánh Hưng