[iOS] Moya

Charlie·2022년 10월 2일
0

모야?

기본 사용법

Moya Github에서 제공해주는 기본 템플릿을 보고 따라해보면서 기본 사용법에 대해 알아보자.

1. API targets enum 생성

새로운 파일을 만들고 enum을 선언해서 사용될 targets들을 작성하자.

enum MyService {
	case showUser(id: Int)
    case createUser(firstName: String, lastName: String)
}

2. TargetType 구현

Moya는 MoyaProvider<TargetType>으로 request를 수행하기 때문에 앞서 정의한 API가 TargetType 프로토콜을 구현해야 한다.

extension에서 TargetType 프로토콜을 채택하고 아래의 프로퍼티들을 상황에 맞게 구현하면 된다.

  • baseURL : 서버의 endpoint 도메인
  • path : baseURL 도메인 뒤에 추가될 path
  • method : HTTP method
  • sampleData : 테스트용 mock data
  • task : request에 사용될 파라미터
  • headers : HTTP header
  • validationType : 허용할 response 타입

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) }

3. request, response

앞서 정의한 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)
    }
}

Reference

Moya Github
[iOS] Moya를 사용한 네트워킹 (Swift Http 통신
[iOS] Moya에 대해서 공부해보아요

profile
Hello

0개의 댓글