모야?
Moya Github에서 제공해주는 기본 템플릿을 보고 따라해보면서 기본 사용법에 대해 알아보자.
새로운 파일을 만들고 enum을 선언해서 사용될 targets들을 작성하자.
enum MyService {
case showUser(id: Int)
case createUser(firstName: String, lastName: String)
}
Moya는 MoyaProvider<TargetType>
으로 request를 수행하기 때문에 앞서 정의한 API가 TargetType 프로토콜을 구현해야 한다.
extension에서 TargetType 프로토콜을 채택하고 아래의 프로퍼티들을 상황에 맞게 구현하면 된다.
TargetType 프로토콜을 채택할 때에는 아래와 같이 switch문을 사용하면 편리하다.
extension MyService: TargetType {
var baseURL: URL {
URL(string: "https://api.myservice.com")!
}
var path: String {
switch self {
case .showUser(let id):
return "/users/\(id)"
case .createUser(_, _):
return "/users"
}
}
var method: Moya.Method {
switch self {
case .showUser:
return .get
case .createUser
return .post
}
}
var task: Task {
switch self {
case .showUser:
return .requestPlain
case let .createUser(firstName, lastName):
return .requestParameters(parameters: ["first_name": firstName, "last_name": lastName], encoding: JSONEncoding.default)
}
}
var sampleData: Data {
switch self {
case .showUser(let id):
return "{\"id\": \(id), \"first_name\": \"Harry\", \"last_name\": \"Potter\"}".utf8Encoded
case let .createUser(firstName, lastName):
return "{\"id\": \(id), \"first_name\": \"\(firstName)\", \"last_name\": \"\(lastName)\"}".utf8Encoded
}
}
var headers: [String: String]? {
return ["Content-type": "application/json"]
}
}
// MARK: - Helpers
private extension String {
var urlEscaped: String {
addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
}
var utf8Encoded: Data { Data(self.utf8) }
앞서 정의한 TargetType을 이용해 request를 보내고 response를 받을 수 있다.
우선 URLSession때와 마찬가지로 response에 맞는 DTO를 Decodable을 채택하는 모델로 만들어주고,
아래와 같이 request를 보내면 된다.
let provider = MoyaProvider<MyService>()
provider.request() { result in
switch result {
case .success(let response):
let result = try? response.map(ArticleDTO.self)
case .failure(let error):
print(error.localizedDescription)
}
}
Moya Github
[iOS] Moya를 사용한 네트워킹 (Swift Http 통신
[iOS] Moya에 대해서 공부해보아요