RxNetworkApiClient 0.1.4

RxNetworkApiClient 0.1.4

Starmel 维护。



 
依赖
RxSwift>= 0
SwiftyJSON>= 0
 

  • 作者
  • starmel

RxNetworkApiClient

需求

  • RxSwift
  • SwiftyJson
  • 所有实体都需要 Codable 标记。
  • 在发送请求或初始化新的 ApiClient 使用 defaultInstance(host:) 之前,需要设置默认的 ApiEndpoint.baseEndpoint

示例

class TodoItem: Codable{
    var title: String? = nil
}


let apiClient = ApiClientImp.defaultInstance("https://jsonplaceholder.typicode.com")
let request: ApiRequest<TodoItem> = .request(path: "/todos", method: .get)

apiClient.execute(request)
    .subscribe(onSuccess: { (items: [TodoItem])
        // use result
    })

特性

拦截器

用于在发送请求之前修改请求和执行额外的响应处理。

内置日志拦截器结果示例

>>> https://jsonplaceholder.typicode.com/todos [GET]

<<< https://jsonplaceholder.typicode.com/todos
<<< Status code: (200) 👌
<<< Body: Body: [
  {
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
  },
  ...

自定义OAuth2拦截器示例

import Foundation
import RxNetworkApiClient
import RxSwift


class AuthInterceptor: Interceptor {

    private let settings: Settings


    init(_ settings: Settings) {
        self.settings = settings
    }

    func prepare<T: Codable>(request: ApiRequest<T>) {
        if let accessToken = settings.authCode?.accessToken {
            let hasAuthHeader = request.headers?.contains(where: { header in
                header.key == "Authentication"
            })

            if hasAuthHeader != true {
                if request.headers == nil {
                    request.headers = []
                }
                request.headers!.append(Header("Authentication", accessToken))
            }
        }
    }

    func handle<T: Codable>(request: ApiRequest<T>, response: NetworkResponse) {
        // empty
    }
}

自定义Http Body转换器

为发送的实体添加JsonBodyConvertible协议标记

struct NoteEntity: JsonBodyConvertible {

    var date: Date
    var text: String
    var warning_level: Int
}


let note = NoteEntity(date: Date(), text: "note text", warning_level: Int.max)
let request: ApiRequest<JSON> = .request(path: "/todo/add",
                                         method: .post,
                                         body: note)

apiClient.execute(request: request).subscribe()

显示输出

>>> https://jsonplaceholder.typicode.comtodo/add [POST] Parameters: {"date":558022549.47259104,"text":"note text","warning_level":9223372036854775807}

自定义响应处理器

在返回结果给订阅者之前,响应正在逐步处理响应处理器堆栈

文件上传

let imgs = ["https://pp.userapi.com/c834302/v834302737/278d7/DoAiIaCb5hY.jpg?ava=1",
                "https://2static1.fjcdn.com/comments/When+i+was+a+small+kid+and+tried+smoking+i+_57ab9cf4d3afaa9daba047a508dc4f2f.jpg"]
            .compactMap { URL(string: $0)! }
            .compactMap { try! Data(contentsOf: $0) }

let files = [UploadFile(name: "file 1.jpg", data: imgs[0], mimeType: "jpg"),
                  UploadFile(name: "file 2.jpg", data: imgs[1], mimeType: "jpg")]

let request: ApiRequest<JSON> = .request("/file/add", method: .post, files: files)

apiClient.execute(request: request).subscribe()

请求可用操作的全列表

static public func request<ResponseType: Codable>(
            path: String? = nil,
            method: HttpMethod,
            endpoint: ApiEndpoint = ApiEndpoint.baseEndpoint,
            headers: [Header]? = nil,
            formData: FormDataFields? = nil,
            files: [UploadFile]? = nil,
            body: BodyConvertible? = nil,
            query: QueryField...) -> ApiRequest<ResponseType> {

安装

RxNetworkApiClient通过CocoaPods提供。要安装它,只需将以下行添加到您的Podfile中

pod 'RxNetworkApiClient'

作者

starmel, [email protected]

许可证

RxNetworkApiClient可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。