Alamofire AFRouter: URLRequestConvertible 사용하기

JiSNG·2020년 9월 3일
0

Alamofire는 공식문서 가 참 잘 나와있는 것 같아요 ... 예제까지 잘 나와있습니다!

Routing Request

한 줄로 해석하면, 라우터에 request의 구성 요소를 정의하여 네트워크 스택 구축 시 공통 패턴을 채택할 수 있도록 한다고 되어 있습니다.

네트워크 요청 부분을 분리(캡슐화)해서 사용하고 있다고 보면 됩니다.

라우터는URLRequestConvertible 을 채택하고, Enum 타입으로 작성하면 됩니다.

URLRequestConvertible
'HTTP메서드, 헤더, 매개변수와 같은 초기 매개변수들'을 URLReqestConvertible로 캡슐화 하여 값을 전달합니다.
URLRequest는 기본적으로 URLRequestConvertible을 따르므로 요청, 업로드 및 다운로드 메서드에 직접 전달할 수 있습니다.

공식 문서에 나와 있는 예제입니다.

enum Router: URLRequestConvertible {
    case get, post
    
    var baseURL: URL {
        return URL(string: "https://httpbin.org")!
    }
    
    var method: HTTPMethod {
        switch self {
        case .get: return .get
        case .post: return .post
        }
    }
    
    var path: String {
        switch self {
        case .get: return "get"
        case .post: return "post"
        }
    }
    
    func asURLRequest() throws -> URLRequest {
        let url = baseURL.appendingPathComponent(path)
        var request = URLRequest(url: url)
        request.method = method
        
        return request
    }
}

AF.reqeust 찍어보면 파라미터에 URLConvertible 타입을 받는 것도 있고, URLRequestConvertible 타입을 받는 것도 있습니다.

사용은 AF.request(Router.get) 이렇게 하면 됩니다.

Router 에서 case 하나를 선택하면,
case에 따른 path와 parameter가 딸려오고,
asURLRequest() 함수에 의해 URLRequest 타입으로 만들어 반환합니다.

Encoding도 라우터안에서 만들 수 있습니다.

예제는 역시 공식문서 ...

enum Router: URLRequestConvertible {
    case get([String: String]), post([String: String])
    
    var baseURL: URL {
        return URL(string: "https://httpbin.org")!
    }
    
    var method: HTTPMethod {
        switch self {
        case .get: return .get
        case .post: return .post
        }
    }
    
    var path: String {
        switch self {
        case .get: return "get"
        case .post: return "post"
        }
    }
    
    func asURLRequest() throws -> URLRequest {
        let url = baseURL.appendingPathComponent(path)
        var request = URLRequest(url: url)
        request.method = method
        
        switch self {
        case let .get(parameters):
            request = try URLEncodedFormParameterEncoder().encode(parameters, into: request)
        case let .post(parameters):
            request = try JSONParameterEncoder().encode(parameters, into: request)
        }
        
        return request
    }
}

그동안 request 함수를 사용하며 파라미터로 넘기던 것을 따로 분리한 거라고 생각하면 될 것 같습니다.

profile
JiSNG+iOS

0개의 댓글