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文件。