이번 포스팅을 마지막으로 Alamofire에 대한 기본적인 내용을 알아보는 것은 마무리하려고하고 실제로 Alamofire를 이용해서 간단한 REST API방식의 데이터 송수신을 하는것을 Postman 프로그램과 함께 사용해서 만들어보려고 한다.
먼저, 저번에 정리하지 못한 Encoder
를 정리하려고 한다.
Alamofire
에는 ParameterEncoder
를 따르는 JSONParameterEncoder
와 URLEncodedFormParameterEncoder
를 포함한다. 이 두가지 방식이 가장 흔히 사용되는 인코딩 방식이라고 한다.
(깃허브 문서에는 XML Encoding에 대해서는 독자들에게 공부하라고 남긴 것을 보니 XML방식도 포함하긴 하는 듯 하다.)
URLEncodedFormParameterEncode
는 URL 인코딩 문자열로 값을 인코딩해 기존 URL 쿼리 문자열로 설정 및 추가하거나 request
의 HTTP body
로 설정한다.
3가지 방식의URLEncodedFormParameterEncoder.Destination
을 사용해 인코딩의 대상을 설정해 인코딩된 문자열이 설정될 위치는 컨트롤 할 수 있다.
.methodDependent
인코딩된 쿼리 문자열 결과를.get
, .delete
, .head
요청에 대한 쿼리 문자열에 적용하고 다른 HTTP Method
요청에 대한 HTTP body
로 설정한다.
.queryString
인코딩된 문자열을 요청 URL 쿼리에 설정하거나 추가한다.
.httpBody
인코딩된 문자열을 URLRequest의 HTTP body
로 설정한다.
get
요청let parameters = ["foo": "bar"]
// 3가지 방식은 모두 동일
AF.request("https://url/get", parameters: parameters)
AF.request("https://url/get", parameters: parameters, encoder: URLEncodedFormParameterEncoder.default)
AF.request("https://url/get", parameters: parameters, encoder: URLEncodedFormParameterEncoder(destination: .methodDependent))
// 인코딩 결과
// https://url/get?foo=bar
post
요청let parameters: [String: [String]] = [
"foo": ["bar"],
"baz": ["a", "b"],
"qux": ["x", "y", "z"]
]
// 3가지 방식은 모두 동일
AF.request("https://url/post", method: .post, parameters: parameters)
AF.request("https://url/post", method: .post, parameters: parameters, encoder: URLEncodedFormParameterEncoder.default)
AF.request("https://url/post", method: .post, parameters: parameters, encoder: URLEncodedFormParameterEncoder(destination: .httpBody))
// 인코딩된 매개변수
// HTTP body: "qux[]=x&qux[]=y&qux[]=z&baz[]=a&baz[]=b&foo[]=bar"
JSONParameterEncoder
는 Swift의 JSONEncoder
를 사용해 Encodable
값을 인코딩하고 결과를 URLRequest
의 HTTP Body
로 설정한다.
post
요청let parameters: [String: [String]] = [
"foo": ["bar"],
"baz": ["a", "b"],
"qux": ["x", "y", "z"]
]
// 아래 방식은 모두 동일
AF.request("https://url/post", method: .post, parameters: parameters, encoder: JSONParameterEncoder.default)
AF.request("https://url/post", method: .post, parameters: parameters, encoder: JSONParameterEncoder.prettyPrinted)
AF.request("https://url/post", method: .post, parameters: parameters, encoder: JSONParameterEncoder.sortedKeys)
// 인코딩된 매개변수
// HTTP body: {"baz":["a","b"],"foo":["bar"],"qux":["x","y","z"]}
아래 예제처럼 필요에 맞게 JSONEncoder
인스턴스를 구성해서 JSONParameterEncoder
를 정의할 수도 있다.
let encoder = JSONEncoder()
encoder.dateEncoding = .iso8601
let parameterEncoder = JSONParameterEncoder(encoder: encoder)
와 진짜 정리... 너무 감사합니다.