최근 프로젝트에서 Moya 라이브러리를 활용하여 네트워크 로직을 구현하던 중, 제대로 공부를 하지 않고 활용하여 API 통신을 실패한 경험이 있다.(스웨거만 제대로 봤어도..)
Moya에서 TargetType을 채택한 API를 구성할 떄, 아래와 같이 HTTP Task를 구성한다.
var task: Task {
switch self {
case .login(let provider, let DTO):
let params: [String: Any]
switch provider {
case .kakao:
params = ["accessToken": DTO.accessToken]
case .apple:
params = ["idToken": DTO.accessToken]
}
return .requestParameters(parameters: params, encoding: JSONEncoding.prettyPrinted)
...
case .checkInvitationCode(let DTO):
let query: [String: Any] = [
"showId": DTO.showId,
"salesTicketTypeId": DTO.salesTicketTypeId,
"inviteCode": DTO.inviteCode
]
return .requestParameters(parameters: query, encoding: URLEncoding.queryString)
Task는 네트워크 파라미터를 지정하는 것인데, 위와 같이 대표적으로 JSONEncoding.prettyPrinted와 URLEncoding.queryString이 있다.
두 개의 차이점이 무엇일까?
Alomofire의 깃헙 문서에 들어가서 확인을해보면
URLEncoding.queryString
- Sets or appends encoded query string result to existing query string.
- 기존에 존재하는 queryString에 인코딩된 query String을 붙힌다.
라고 되어있다.
즉 쉽게 말하자면, URLEncoding.queryString은 URL 쿼리 문자열의 형태로 데이터를 인코딩을 하는 것인데, URL 쿼리 문자열은 key=value 쌍으로 데이터를 표현하며, 각 쌍은 &로 구분된다. 주로 HTTP GET 요청에서 활용이된다고 보면 된다.
예시로는 아래와 같은 Request URL이 있다. 각 쿼리 문자열은 key와 value 값으로 표현이 되고, 각 쌍은 &로 이어짐을 알 수 있다.
invite-code?showId=1&salesTicketTypeId=1&inviteCode=%ED%99%8D%EA%B8%B8%EB%8F%99
JSONEncoding.prettyPrinted
JSONEncoding.prettyPrinted는 이와 다르게 파리미터를 구성하는데, 말 그대로 JSON 형식의 데이터를 인코딩한다. 주로 HTTP POST 요청 시에 사용되며, 요청 바디에 JSON 형식의 데이터를 포함시킬 때 유용하다. 만약 내가 request body에 JSON 형식의 파라미터를 넣고 싶을 떄는 아래와 같이 사용하면 된다.
case .login(let provider, let DTO):
let params: [String: Any]
switch provider {
case .kakao:
params = ["accessToken": DTO.accessToken]
case .apple:
params = ["idToken": DTO.accessToken]
}
return .requestParameters(parameters: params, encoding: JSONEncoding.prettyPrinted)
이 경우는 앞선 URLEncoding과는 다르게 JSON 형식의 데이터가 body에 들어가되어 request URL에는 해당 데이터들이 보이지 않는다.
'iOS' 카테고리의 다른 글
[iOS] 특정영역만으로 QR 코드 스캔하기(feat. AVFoundation) (0) | 2024.06.26 |
---|---|
[iOS] TabbarController의 presentingViewController(feat.currentContext) (0) | 2024.03.26 |
[iOS] CollectionView Reordering (feat. WWDC 20) (3) | 2023.09.15 |
[iOS] Core Location Unit Test하기(feat. WWDC18) (0) | 2023.07.23 |
[iOS] 공식문서로 보는 Core Location (0) | 2023.07.16 |