Конечная точка строителя Swift - PullRequest
0 голосов
/ 25 июня 2018

Я хотел бы создать способ построения конечной точки следующим образом:

let endpoint: String = APIRequest.Playlist.getById(idValue).param1(param1value).param2(param2value)

У меня есть класс APIRequest с baseUrl, и я пытался использовать перечисления. Параметры в кодировке URL.

Как мне достичь своей цели?

1 Ответ

0 голосов
/ 25 июня 2018

Если вы используете Alamofire, вы можете создать конечные точки, как показано ниже,

Создайте протокол, как показано ниже, и расширьте его для реализации по умолчанию.

import Foundation
import Alamofire

public protocol Endpoint {
    var baseURL: String { get } // https://example.com
    var path: String { get } // /users/
    var fullURL: String { get } // This will automatically be set. https://example.com/users/
    var method: HTTPMethod { get } // .get
    var encoding: ParameterEncoding { get } // URLEncoding.default
    var body: Parameters { get } // ["foo" : "bar"]
    var headers: HTTPHeaders { get } // ["Authorization" : "Bearer SOME_TOKEN"]
}


public extension Endpoint {

    var encoding: ParameterEncoding {
        return method == .get ? URLEncoding.default : JSONEncoding.default
    }

    var fullURL: String {
        return baseURL + path
    }

    var body: Parameters {
        return Parameters()
    }

    var headers : HTTPHeaders{
        return [:]
    }

    var baseURL : String{

        return Config.baseUrl
    }
}

Создайте перечисление для APIEndpoints и добавьте туда свои дела. Расширьте APIEndponts для ваших пользовательских случаев.

enum APIEnpoints {
    case login(apiModel:APILogInRequest)
    case home
}

extension APIEnpoints : Endpoint {

    var path: String {

        switch self{

        case .login(_): return "/api/v1/user/get_auth_token/"

        case .home: return "/api/v1/home/"

        }

    }

    var method: HTTPMethod {

        switch self{

        case .login(_): return .post

        case .home: return .get

        }

    }

    var headers : HTTPHeaders{

        return ["Authorization":"JWT " + authtoken]
    }


    var body: Parameters {

        var body: Parameters = Parameters()
        switch self {

        case .login(let model):
            body = model.toDictionary 
            break

        case .home:
            break

        }

        return body

    }

}

И, наконец, вы можете использовать свои конечные точки, как показано ниже

let model = APILogInRequest.init("email","password")
//1
APIEnpoints.login(apiModel: model)

//2
APIEnpoints.home
...