Ship 1.0.0

Ship 1.0.0

Kyohei Ito维护。



Ship 1.0.0

  • 作者
  • Kyohei Ito

🚢Ship

Carthage compatible Build Status codecov Version License Platform

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许可证下。有关详细信息,请参阅许可证文件。