🚢  Ship
Ship is a APIKit plugin that can inject common processing to requests on 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 is a type-safe networking abstraction layer that is super cool.
Requirements
- Swift 5.0
 
How to Install
CocoaPods
Add the following to your Podfile:
pod "Ship"Carthage
Add the following to your Cartfile:
github "cats-oss/Ship"How to use Ship
Dependency
The advantage of Ship is that common processing can be injected.
Methods
func buildBaseURL<R: Request>(_ request: R) -> URL
func buildHeaderFields<R: Request>(_ request: R) -> [String: String]Called each time a request is created. Return the base URL and request header.
func intercept<R: Request>(request: R, urlRequest: URLRequest) throws -> URLRequestCalled each time a request is created. Change the request as needed.
func intercept<R: Request>(request: R, object: Any, urlResponse: HTTPURLResponse) throws -> AnyCalled each time of response. Change the response object as needed.
Example
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
}Request
Ship's Request inherits APIKit's Request.
Variables
var basePathComponent: Component? { get }Return the base path component.
Example
var basePathComponent: AnyBasePathComponent? {
    return AnyBasePathComponent(basePath: "/v3")
}RequestBasePathComponent
Can define the components of the request base path.
Variables
var basePath: String? { get }Return the string that is the basis of the path.
Example
- Component
 
enum APIVersion: String, RequestBasePathComponent {
    case undefined
    case v1
    case v2
    var basePath: String? {
        switch self {
        case .undefined:
            return nil
        default:
            return "/\(rawValue)"
        }
    }
}- Request
 
extension Request {
    var basePathComponent: APIVersion? {
        return .v1
    }
}
struct GetUserRequest: Request {
    typealias Response = User
    let method = HTTPMethod.get
    let path = "/me"
}- Dependency
 
struct RequestDependency: Dependency {
    func buildBaseURL<R: APIRequest>(_ request: R) -> URL {
        return URL(string: "https://example.com")!
    }
}The session makes a URL like following:
https://example.com/v1/me
LICENSE
Under the MIT license. See LICENSE file for details.