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
}

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

results matching ""

    No results matching ""