🚢 Ship
Ship是一个可以注入到APIKit上的请求的APIKit插件,它可以为请求注入常见的处理。
struct RequestDependency: Dependency {
var baseURL: URL
var accessToken: String
func buildBaseURL<R: APIRequest>(_ request: R) -> URL {
return baseURL
}
func buildHeaderFields<R: APIRequest>(_ request: R) -> [String: String] {
var headerFields = request.headerFields
headerFields["authorization"] = "Bearer \(accessToken)"
return headerFields
}
}
let session = Session(dependency: RequestDependency())
APIKit是一个类型安全的网络抽象层,非常酷。
需求
- Swift 5.0
如何安装
CocoaPods
将以下内容添加到您的Podfile
中
pod "Ship"
Carthage
将以下内容添加到您的Cartfile
中
github "cats-oss/Ship"
如何使用Ship
依赖
Ship 的优势在于可以注入公共处理。
方法
func buildBaseURL<R: Request>(_ request: R) -> URL
func buildHeaderFields<R: Request>(_ request: R) -> [String: String]
每次创建请求时调用。返回基础 URL 和请求头。
func intercept<R: Request>(request: R, urlRequest: URLRequest) throws -> URLRequest
每次创建请求时调用。可根据需要修改请求。
func intercept<R: Request>(request: R, object: Any, urlResponse: HTTPURLResponse) throws -> Any
每次响应时调用。可根据需要修改响应对象。
示例
func buildBaseURL<R: APIRequest>(_ request: R) -> URL {
return URL(string: "https://example.com")!
}
func buildHeaderFields<R: APIRequest>(_ request: R) -> [String: String] {
var headerFields = request.headerFields
headerFields["authorization"] = "Token"
return headerFields
}
请求
Ship 的请求继承自 APIKit 的请求。
变量
var basePathComponent: Component? { get }
返回基础路径组件。
示例
var basePathComponent: AnyBasePathComponent? {
return AnyBasePathComponent(basePath: "/v3")
}
RequestBasePathComponent
可以定义请求基础路径的组件。
变量
var basePath: String? { get }
返回路径的字符串基础。
示例
- 组件
enum APIVersion: String, RequestBasePathComponent {
case undefined
case v1
case v2
var basePath: String? {
switch self {
case .undefined:
return nil
default:
return "/\(rawValue)"
}
}
}
- 请求
extension Request {
var basePathComponent: APIVersion? {
return .v1
}
}
struct GetUserRequest: Request {
typealias Response = User
let method = HTTPMethod.get
let path = "/me"
}
- 依赖
struct RequestDependency: Dependency {
func buildBaseURL<R: APIRequest>(_ request: R) -> URL {
return URL(string: "https://example.com")!
}
}
会话生成如下URL
https://example.com/v1/me
许可证
在MIT许可证下。有关详细信息,请参阅许可证文件。