이번 포스팅을 마지막으로 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)
와 진짜 정리... 너무 감사합니다.