Moya에서 Query Parameters와 Encoding 처리 방법

2024. 12. 6. 11:11GPT는 블로그 글도 써준다

GPT는 블로그 글도 써준다.

Moya에서 Query Parameters와 Encoding 처리 방법

Moya는 Swift에서 널리 사용되는 네트워크 라이브러리로, 간결하고 효율적으로 API 요청을 처리할 수 있도록 도와줍니다. 이번 글에서는 Moya를 사용해 API 요청을 보낼 때, 특히 Query ParametersEncoding에 대해 알아보고, 실수를 방지하는 방법을 설명합니다.


Moya의 Task와 Query Parameters

Moya의 Task는 API 요청의 본문과 관련된 데이터를 정의하는 데 사용됩니다. Query Parameters를 사용하는 API 요청에서는 적절한 Task를 설정해야 합니다.

Moya에서는 주로 다음과 같은 Task 타입이 사용됩니다:

  • .requestPlain: 본문 없이 단순 요청.
  • .requestParameters: 쿼리 파라미터나 요청 본문 데이터를 포함.
  • .requestJSONEncodable: Encodable 객체를 JSON 형태로 인코딩.

Query Parameters 인코딩

쿼리 파라미터를 인코딩할 때, URLEncoding을 사용하여 파라미터를 URL에 추가할 수 있습니다. 일반적으로 다음 두 가지 옵션이 있습니다:

  1. URLEncoding.queryString: 파라미터를 URL의 쿼리 문자열로 추가합니다.
  2. URLEncoding.httpBody: 파라미터를 HTTP 요청 본문에 추가합니다.

쿼리 파라미터를 URL에 포함하려면 URLEncoding.queryString을 사용합니다.


예제 코드

다음은 Moya를 사용해 GET 요청을 보내는 예제입니다. 이 요청은 특정 userIdfilter를 쿼리 파라미터로 포함합니다:

import Moya

enum UserService {
    case fetchUserDetails(userId: String, filter: String)
}

extension UserService: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }

    var path: String {
        switch self {
        case .fetchUserDetails(let userId, _):
            return "/users/\(userId)"
        }
    }

    var method: Moya.Method {
        return .get
    }

    var task: Task {
        switch self {
        case .fetchUserDetails(_, let filter):
            return .requestParameters(
                parameters: ["filter": filter],
                encoding: URLEncoding.queryString
            )
        }
    }

    var headers: [String: String]? {
        return ["Content-Type": "application/json"]
    }
}

중요한 점: Query 인코딩

위 코드에서 URLEncoding.queryString은 파라미터를 URL에 추가합니다. 예를 들어:

let provider = MoyaProvider<UserService>()
provider.request(.fetchUserDetails(userId: "123", filter: "active")) { result in
    switch result {
    case .success(let response):
        print("Response: \(response)")
    case .failure(let error):
        print("Error: \(error)")
    }
}

위 요청은 다음과 같은 URL을 생성합니다:

https://api.example.com/users/123?filter=active

Moya는 URLEncoding을 통해 쿼리 파라미터를 적절히 인코딩하므로, 특수 문자나 공백이 포함된 경우에도 안전하게 처리됩니다.


디버깅과 문제 해결

Query Parameters가 예상대로 추가되지 않거나 인코딩 문제가 발생하는 경우 다음을 확인하세요:

  1. Task 확인: 쿼리 파라미터를 URL에 포함하려면 반드시 URLEncoding.queryString을 사용해야 합니다. 기본값은 httpBody일 수 있으니 주의하세요.
  2. URL 로그 출력: 요청이 생성된 후 최종 URL을 확인하여 쿼리 파라미터가 제대로 인코딩되었는지 확인합니다:
  3. provider.request(.fetchUserDetails(userId: "123", filter: "active")) { result in if case let .success(response) = result { print(response.request?.url?.absoluteString ?? "No URL") } }
  4. 인코딩 문제: 특정 문자(예: &, ?, =)가 올바르게 인코딩되지 않을 경우, URLEncoding.default 대신 URLEncoding.queryString을 명시적으로 설정하세요.

결론

Moya에서 Query Parameters를 처리할 때는 적절한 TaskEncoding을 설정하는 것이 중요합니다. 특히 URLEncoding.queryString을 사용하면 쿼리 파라미터를 URL에 포함할 수 있습니다. 서버와의 통신에서 인코딩 문제가 발생하지 않도록 항상 URL 로그를 확인하고, 파라미터와 Encoding 설정을 정확히 지정하세요.

반응형