RequestKit 是 octokit.swift、TanukiKit、TrashCanKit 和 VloggerKit 的基础。
# Cartfile
github "nerdishbynature/RequestKit"
# Podfile
pod "NBNRequestKit"
要使用 RequestKit 发起请求,您需要三个部分:一个 Router
(路由器)、一个 Configuration
(配置)以及通常一个了解两者并将它们连接起来的对象。请参阅 OctoKit。
路由器 (Router) 通过 Router
协议定义。建议将它们定义为 Enumerations
(枚举),每个路由对应一个 case。
这是一个基本的路由器 (Router) 的示例
enum MyRouter: Router {
case getMyself(Configuration)
var configuration: Configuration {
switch self {
case .getMyself(let config): return config
}
}
var method: HTTPMethod {
switch self {
case .getMyself:
return .GET
}
}
var encoding: HTTPEncoding {
switch self {
case .getMyself:
return .url
}
}
var path: String {
switch self {
case .getMyself:
return "myself"
}
}
var params: [String: Any] {
switch self {
case .getMyself(_):
return ["key1": "value1", "key2": "value2"]
}
}
}
由于 RequestKit 被设计为处理 OAuth 请求,我们需要一些东西来存储用户凭据。这就是配置 (Configuration) 发挥作用的地方。配置 (Configuration) 在 Configuration
协议中定义。
public struct TokenConfiguration: Configuration {
public let accessToken: String?
public let apiEndpoint = "https://my.webservice.example/api/2.0/"
public let accessTokenFieldName = "access_token"
public let errorDomain = "com.my.customErrorDomain"
public init(_ accessToken: String? = nil) {
self.accessToken = accessToken
}
}
在上面的 Configuration
中,accessToken
(访问令牌)将作为名为 access_token
的 URL 参数与每个请求一起传递。或者,您可以通过将 authorizationHeader
属性设置为所需的令牌类型,将 accessToken
(访问令牌)在 HTTP Authorization header(授权标头)中传递。例如,以下 Configuration
将其作为 Bearer token(Bearer 令牌)传递。
public struct TokenConfiguration: Configuration {
public let accessToken: String?
public let apiEndpoint = "https://my.webservice.example/api/2.0/"
public let authorizationHeader: String? = "Bearer"
public let errorDomain = "com.my.customErrorDomain"
public init(_ accessToken: String? = nil) {
self.accessToken = accessToken
}
}
我们将需要一些东西来连接路由器 (Router) 和配置 (Configuration),以提供方便的接口。常用的方法是使用 struct
(结构体)或 class
(类)来为您完成这项工作。
struct User : Codable {
}
struct MyWebservice {
var configuration: Configuration
init(configuration: Configuration) {
self.configuration = configuration
}
func getMyself(session: RequestKitURLSession = URLSession.shared, completion: @escaping (_ response: Response<User>) -> Void) -> URLSessionDataTaskProtocol? {
let router = MyRouter.getMyself(self.configuration)
return router.load(session, expectedResultType: User.self) { user, error in
if let error = error {
completion(Response.failure(error))
} else if let user = user {
completion(Response.success(user))
}
}
}
}
您的用户只需调用您的 MyWebservice
即可
let config = TokenConfiguration("123456")
MyWebservice(configuration:config).getMyself { response in
switch response {
case .success(let user):
print(user)
case .failure(let error):
print(error)
}
}
}