저는 MOYA를 사용하면서 가장 간편했던 것은 BaseAPI, BaseTargetType을 설정해서 반복되는 코드가 많은 서버 통신 코드를 가독성 높고 체계적으로 정리할 수 있다는 점에서 정말 편했습니다. 근데 이번에 알랑가파이어를 배우면서도 이런 식으로 정리할 수 있지 않을까? 싶어서
알랑가 파이어의 BaseAPI과 BaseTargetType을 사용해서 통신하는 걸 쉽게 적용할 줄 알았는데 멍청이 류희디는 시간이 오래 걸리더라고요~ 그래서 공부한김에 정리해서 올립니다~~~
BaseURL과 APIKey를 안전하게 사용하기 위한 방법이죠? 세미나 자료에 있는 내용과 같습니다!
import Foundation
enum Config {
enum Keys {
enum Plist {
static let baseURL = "BASE_URL"
static let api = "MOVIE_API"
}
}
private static let infoDictionary: [String: Any] = {
guard let dict = Bundle.main.infoDictionary else {
fatalError("plist cannot found.")
}
return dict
}()
}
extension Config {
static let baseURL: String = {
guard let key = Config.infoDictionary[Keys.Plist.baseURL] as? String else {
fatalError("Base URL is not set in plist for this configuration.")
}
return key
}()
static let api: String = {
guard let key = Config.infoDictionary[Keys.Plist.api] as? String else {
fatalError("Base URL is not set in plist for this configuration.")
}
return key
}()
}
네트워크 결과들을 모와둔 열거형 객체들 입니다! 다양한 오류가 생길 수 있기 때문에 여러가지를 정의해뒀어요!
import Foundation
enum NetworkResult<T> {
case success(T) // 서버 통신 성공했을 때,
case requestErr(String) // 요청 에러 발생했을 때,
case decodedErr // 디코딩 오류 발생했을 때
case pathErr // 경로 에러 발생했을 때,
case serverErr // 서버의 내부적 에러가 발생했을 때,
case networkFail // 네트워크 연결 실패했을 때
case authorizationFail(T) // 토큰 인증 오류
}
헤더에 들어갈 다양한 내용을 미리 정리해둔 파일입니다. 지금은 로그인이나 멀티파트 통신을 하지 않기 때문에, 다소 간소하지만, 나중에 갈수록 header에 들어가는 값도 많아지기 때문에 이런 식으로 정리하면 좋을거 같습니다
import Foundation
struct APIConstants{
static let contentType = "Content-Type"
static let applicationJSON = "application/json"
}
extension APIConstants{
static var noTokenHeader: Dictionary<String,String> {
[contentType: applicationJSON]
}
}
이번 과제에서 사용하진 않았지만 서버에서 데이터 값 없이 간단한 내용들을 보내줄 때 요긴하게 써먹을 수 있습니다!
import Foundation
struct SimpleResponse: Codable {
var status: Int
var success: Bool
var message: String?
}
기존에 활용할때 한꺼번에 data까지 뽑아냈는데 여기서는 단순 path오류를 확인하는 용도이다!
import Foundation
struct GenericResponse<T: Codable>: Codable {
var status_code: Int?
var success: Bool?
var status_message: String?
}