HTTPKit.swift 2.9.0

HTTPKit.swift 2.9.0

Zev维护。



  • zevwings

HTTPKit


HTTPKit是基于Alamofire的网络抽象层,它可以帮助我们规范Alamofire的网络请求。HTTPKit充分的封装了Alamofire网络请求的细节,你可以通过HTTPKit使用到所有Alamofire的功能。 项目主要分为Serviceable, Request, Constructor, Client, Task, Transformer, Plugin这七个模块,他们会帮助我们处理网络请求,分别在不同的阶段帮助我们处理网络请求。

用法

Serviceable

实现服务器网络请求封装

public enum NetwrokService : String {
    case api
    case auth
}

extension NetwrokService: Serviceable {

    public var baseUrl: String {
        switch self {
        case .api:
                return "https://api.base.com"
        case .auth
                return "https://auth.base.com"
        }
    }
}

Request

enum MessageCenter {

    /// 主面板
    case board(String)
    case content(String, paginator: Paginator)
}

extension MessageCenter : Request {

    typealias Service = NetwrokService

    /// 基础路径
    var service: Service {
        return .message
    }

        /// 请求路由
    var route: Route {
        switch self {
        case .board:
            return .post("message/board")
        case .content:
            return .post("message/content")
        }
    }

    /// 请求内容
    var content: Content {
        switch self {
        case .board(let type):
            var parameters: [String: String] = [:]
            ...
            return .requestParameters(formatter: .json, parameters: parameters)
        case .content(let messageType, _):
            var parameters: [String: String] = [:]
            ...
            return .requestParameters(formatter: .json, parameters: parameters)
        }
    }

        /// 分页控制器
    var paginator: Paginator? {
        switch self {
        case .content(_, let paginator):
            return paginator
        default:
            return nil
        }
    }

    /// 数据转换器
    var transformer: Transformer? {
        return BasicTransformer()
    }
}

Client

用于发起网络请求

let client = HTTPClient<MessageCenter>()
client.request(request: .board("messageTyp")) { result in
    switch result {
    case .success(let response):
        break
    case .failure(let error):
        break
    }
}

使用 RxSwift

client.rx.request(.board(messageType))
    .mapJSON()
    .subscribe(onSuccess: { json in

    }, onError: { error in

    })

响应

用于处理返回结果

do {
    try response.mapJSON()
} catch {

}

介绍

可服务

可服务是对服务器的封装,在我们开发过程中可能会涉及多个baseUrl,我们可以通过可服务来封装。

public protocol Serviceable {

    /// 服务器基础路径
    var baseUrl: String { get }
}

请求

请求它封装了一组类似的网络请求,这是一个抽象的协议,它包含了我们需要访问的网络服务节点,网络请求内容、参数以及请求头,它可以预定义处理的返回校验。

public protocol Request {

    /// 服务器
    associatedtype Service: Serviceable

    /// 基础路径
    var service: Service { get }

    /// 请求路径
    var route: Route { get }

    /// 请求内容
    var content: Content { get }

    /// 请求头设置,默认为空
    var headerFields: [String: String] { get }

    /// 校验类型,校验返回的 status code 是否为正确的值,默认校验正确和重定向code
    var validationType: ValidationType { get }

    /// 请求拦截器
    var interceptor: RequestInterceptor? { get }

    /// 分页参数
    var paginator: Paginator? { get }

    /// 数据转换器,默认为`nil`
    var transformer: Transformer? { get }

}

内容

内容是对网络请求内容的封装,通过枚举的形式封装了一组通用的请求参数,请求参数解析以及MultipartFormData的请求体。

/// 请求内容
///
/// - requestPlain 无参数请求
/// - requestParameters: 普通请求
/// - download: 下载文件
/// - downloadParameters: 带参数的文件下载
/// - uploadFile: 上传文件
/// - uploadFormData: 上传`MultipartFormData`
/// - uploadFormDataParameters: 带参数的文件上传`MultipartFormData`
public enum Content {

    /// 参数格式化类型,根据格式化类型选取`Alamofire`的`ParameterEncoding`
    public enum ParameterFormatter {
        case url
        case json
        case custom(ParameterEncoding)
    }

    /// 无参数请求
    case requestPlain

    /// 有参数请求
    case requestParameters(formatter: ParameterFormatter, parameters: Parameters)

    /// 无参数下载请求
    case download(destination: Destination?)

    /// 有参数下载请求
    case downloadParameters(formatter: ParameterFormatter, parameters: Parameters, destination: Destination?)

    /// 上传文件请求
    case uploadFile(fileURL: URL)

    /// 无参数Mutipart上传请求
    case uploadFormData(mutipartFormData: [MultipartFormData])

    /// 有参数Mutipart上传请求
    // swiftlint:disable:next line_length
    case uploadFormDataParameters(formatter: ParameterFormatter, parameters: Parameters, mutipartFormData: [MultipartFormData])
}

路由

路由参考自MoyaSurge,以HTTPMethod(URLString)的形式使请求内容更简单,更简洁。

public enum Route {
    case get(String)
    case post(String)
    case put(String)
    case delete(String)
    case options(String)
    case head(String)
    case patch(String)
    case trace(String)
    case connect(String)
}

客户端

客户端是网络请求客户端的抽象,用于统一发起网络请求

public protocol Client : AnyObject {

    // swiftlint:disable:next type_name
    associatedtype R: Request

    /// 发送一个网络请求
    ///
    /// - Parameters:
    ///   - request: Requestable
    ///   - callbackQueue: 回调线程
    ///   - progressHandler: 进度回调
    ///   - completionHandler: 进度回调
    /// - Returns: 请求任务
    func request(
        request: R,
        callbackQueue: DispatchQueue,
        progressHandler: ((ProgressResponse) -> Void)?,
        completionHandler: @escaping (Result<Response, HTTPError>) -> Void
    ) -> Task?
}

构建器

构建器 是网络请求构建器,从Request构建可用的Alamofire.Request

public protocol Builder {

    /// 处理`Request`,将`Request`处理构建成一个`Alamofire.Request`
    func process<R>(request: R, manager: SessionManager, plugins: [PluginType]) throws -> Requestable where R: Request
}

响应

响应是对返回数据的封装,包含URLRequestHTTPURLResponse以及返回数据的DataStatus Code

public final class Response {

    public let request: URLRequest?
    public let response: HTTPURLResponse?
    public private(set) var data: Data
    public let statusCode: Int

    ...
}

要求

  • iOS 9.0+
  • Swift 5.0

安装

Cocoapod

CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖管理器。

您可以使用以下命令安装 Cocoapod:

$ sudo gem install cocoapods

要使用 CocoaPods 将 HTTPKit 集成到项目中,请将其指定到您的 Podfile

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

target 'TargetName' do
    use_frameworks!
    pod 'HTTPKit' ~> '1.0.0'
end

然后,使用 CocoaPods 安装您的依赖项。

$ pod install

Carthage

Carthage旨在为您的应用程序添加框架提供最简单的方法。

您可以使用以下命令使用Homebrew安装Carthage:

$ brew update
$ brew install carthage

要使用Carthage将HTTPKit集成到您的项目中,请在您的Cartfile中指定它。

github "zevwings/HTTPKit" ~> 0.0.1

然后,使用Carthage使用carthage update构建框架,并将HTTPKit.framework拖入您的项目。

注意

框架位于Carthage/Build下,您应该将其拖到目标 -> 常规 -> 内嵌二进制文件

手动操作

下载此项目,并将HTTPKit.xcodeproj拖入您自己的项目。

在您的目标“常规”选项卡中,单击内嵌二进制文件下的“+”按钮。

选择HTTPKit.framework以将其添加到您的平台。

许可

HTTPKit按照MIT许可证的条款和条件分发。