[API targets 정의]
enum ScriptAPI {
case getScript(fileMetaID: String)
}
[TargetType을 채택 후 API 요청에 필요한 파라미터 정의]
extension ScriptAPI: TargetType {
var validationType: ValidationType {
return .successCodes
}
var baseURL: URL {
return URL(string: Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as? String ?? "BaseURL 에러")!
}
var path: String {
switch self {
case let .getScript(fileMetaID):
return "/file-meta/\\(fileMetaID)/script"
}
}
var method: Moya.Method {
switch self {
case .getScript:
return .get
}
}
var task: Moya.Task {
switch self {
case .getScript:
return .requestParameters(
parameters: ["deflated": "false"],
encoding: URLEncoding.queryString
)
}
}
var headers: [String: String]? {
switch self {
case .getScript:
return nil
}
}
}
[Provider 정의]
Provier는 BaseProvider를 기반으로 각 조건(TargetType에서 정의한 내용)에 해당하는 Provider 객체를 제공하는 Provider 패턴으로 제작됨class Provider<T: TargetType> {
let unAuthProvider: MoyaProvider<T> //기본 Provider
let provider: MoyaProvider<T> // Interceptor를 포함한 Provider
let logProvider: MoyaProvider<T> // Log Plugin을 포함한 Provider
init() {
unAuthProvider = MoyaProvider<T>()
provider = MoyaProvider<T>(session: Session(interceptor: AuthInterceptor.shared))
logProvider = MoyaProvider<T>(session: Session(interceptor: AuthInterceptor.shared), plugins: [MoyaLoggingPlugin()])
}
}
[Service정의]
Result 또는 Single의 형태로 선택 가능[ServiceType 프로토콜 정의]
protocol ServiceType {
func fetchScript(_ fileMetaID: String) -> Single<[Paragraph]>
}
[ServiceType 채택한, ScriptService 객체 생성]