[Swift] Alamofire 사용해보기_(4)

나는 사과·2021년 2월 6일
0

Alamofire

목록 보기
4/4

이번 포스팅을 마지막으로 Alamofire에 대한 기본적인 내용을 알아보는 것은 마무리하려고하고 실제로 Alamofire를 이용해서 간단한 REST API방식의 데이터 송수신을 하는것을 Postman 프로그램과 함께 사용해서 만들어보려고 한다.

먼저, 저번에 정리하지 못한 Encoder를 정리하려고 한다.


Encoder

Alamofire에는 ParameterEncoder를 따르는 JSONParameterEncoderURLEncodedFormParameterEncoder를 포함한다. 이 두가지 방식이 가장 흔히 사용되는 인코딩 방식이라고 한다.
(깃허브 문서에는 XML Encoding에 대해서는 독자들에게 공부하라고 남긴 것을 보니 XML방식도 포함하긴 하는 듯 하다.)

URLEncodedFormParameterEncoder

URLEncodedFormParameterEncode는 URL 인코딩 문자열로 값을 인코딩해 기존 URL 쿼리 문자열로 설정 및 추가하거나 requestHTTP body로 설정한다.
3가지 방식의URLEncodedFormParameterEncoder.Destination을 사용해 인코딩의 대상을 설정해 인코딩된 문자열이 설정될 위치는 컨트롤 할 수 있다.

  1. .methodDependent
    인코딩된 쿼리 문자열 결과를.get, .delete, .head 요청에 대한 쿼리 문자열에 적용하고 다른 HTTP Method 요청에 대한 HTTP body로 설정한다.

  2. .queryString
    인코딩된 문자열을 요청 URL 쿼리에 설정하거나 추가한다.

  3. .httpBody
    인코딩된 문자열을 URLRequest의 HTTP body로 설정한다.

URL 인코딩 매개변수가 있는 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

URL 인코딩 매개변수가 있는 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

JSONParameterEncoder는 Swift의 JSONEncoder를 사용해 Encodable 값을 인코딩하고 결과를 URLRequestHTTP Body로 설정한다.

JSON 인코딩 매개변수가 있는 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)

1개의 댓글

comment-user-thumbnail
2021년 8월 21일

와 진짜 정리... 너무 감사합니다.

답글 달기