RequestKit
octokit.swift、TanukiKit、TrashCanKit 和 VloggerKit 的基础。
安装
Carthage
# Cartfile
github "nerdishbynature/RequestKit"
CocoaPods
# Podfile
pod "NBNRequestKit"
用法
要使用RequestKit发起请求,你需要三部分:一个Router
、一个Configuration
,以及通常是一个既了解它们又连接它们的对象。见OctoKit。
定义一个路由器
路由器是通过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
协议中定义。
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
将作为每个请求的URL参数名称为access_token
的值传递。或者,你可以通过将authorizationHeader
属性设置为所需的令牌类型,将accessToken
传递到HTTP授权头中。例如,以下Configuration
将作为管理员令牌传递。
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
}
}
定义绑定对象
我们需要一些东西来连接路由器和配置,以提供便捷的界面。通常的做法是使用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)
}
}
}