NilNetzwerk
一个超轻量级的网络客户端库。高度启发自 Moya,Alamofire。
您可以做什么
- 进行同步、异步请求。
- 进行链式请求。
- 创建自定义网络客户端。
- 分离构建请求。
- 在执行前拦截和修改请求。
- 处理未授权请求(刷新令牌)。
- 基本认证(Oauth)。
- 添加 JSON 支持。
- 网络日志。
示例
要运行示例项目,请克隆仓库,然后从 Example 目录运行 pod install
。
要求
- iOS 9.3+
- Xcode 8.3+
- Swift 3.2+
安装
NilNetzwerk 通过 CocoaPods 提供。要安装它,只需将以下行添加到 Podfile:
pod 'NilNetzwerk'
用法
发送简单的 GET 请求
import NilNetzwerk
NilNetzwerk.shared.get(url: URL(string: "https://httpbin.org/get")!) { (result: Result<SimpleModel>) in
switch result {
case .success(let response):
print(response)
case .failure(let error):
print(error)
}
}
struct SimpleModel: Codable {}
创建一个请求
您可以通过使用任何类型(枚举、结构体、类)实现“ServiceEndpoint”协议来创建请求。(枚举推荐)
import NilNetzwerk
// An instance of the request generator which prepares the HTTP request.
struct TestRequestGenerator: RequestGenerator {
func generateRequest(withMethod method: HTTPMethod) -> MutableRequest {
return request(withMethod: method) |> withJsonSupport
}
}
// Endpoints that you want to use.
enum TestFetchEndPoint {
case testPost(name: String, job: String)
}
// Implementing ServiceEndpoint protocol
extension TestFetchEndPoint: ServiceEndpoint {
// An instance of the request generator which prepares the HTTP request.
var requestGenerator: RequestGenerator {
return TestRequestGenerator()
}
// The parameters of the endpoint.
var parameters: Codable? {
switch self {
case .testPost(let name, let job):
return TestPostModel(name: name, job: job)
}
}
// The base url for the endpoint.
var baseURL: URL {
switch self {
case .testPost:
return URL(string: "https://reqres.in/api")!
}
}
// The required method.
var method: HTTPMethod {
switch self {
case .testPost:
return .POST
}
}
// The specific path of the endpoint.
var path: String {
switch self {
case .testPost:
return "/users"
}
}
// The query parameters which are added to the url.
var queryParameters: [String : String]? {
switch self {
case .testPost:
return nil
}
}
// The parameters which are added to the header.
var headerParameters: [String : String]? {
switch self {
case .testPost:
return nil
}
}
}
struct TestPostModel: Codable {
let name: String
let job: String
}
创建自定义 RequestGenerator
您可以通过实现 RequestGenerator 协议来创建自定义 RequestGenerator(支持 Json,基本认证)
struct TestRequestGenerator: RequestGenerator {
func generateRequest(withMethod method: HTTPMethod) -> MutableRequest {
return request(withMethod: method) |> withJsonSupport |> withBasicAuth
}
var authUserName: String? {
return "Auth UserName"
}
var authPassword: String? {
return "Auth Password"
}
}
发送异步请求
import NilNetzwerk
let testRequest = Request(endpoint: TestFetchEndPoint.testPost(name: "Nil", job: "iOS"))
NilNetzwerk.shared.executeRequest(request: testRequest) { (result: Result<TestPostModel>) in
switch result {
case .success(let response):
print(response)
case .failure(let error):
print(error)
}
}
发送同步请求
import NilNetzwerk
let testRequest = Request(endpoint: TestFetchEndPoint.testPost(name: "Nil", job: "iOS"))
let result: Result<TestPostModel> = NilNetzwerk.shared.executeRequest(request: testRequest)
switch result {
case .success(let response):
print(response)
case .failure(let error):
print(error)
创建自定义 NetworkClient
您可以通过调用 "NilNetzwerk.shared" 使用默认网络客户端。但是,如果您想要创建自定义网络客户端,您可以扩展 "NilNetzwerk" 类然后实现自己的网络客户端。
import NilNetzwerk
class TestNetworkClient: NilNetzwerk {
override class var shared: TestNetworkClient{
return TestNetworkClient()
}
private let urlSession: URLSession = {
let configuration = URLSessionConfiguration.default
configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData
configuration.timeoutIntervalForRequest = 30
configuration.urlCache = nil
return URLSession(configuration: configuration)
}()
override init() {
super.init(urlSession: urlSession)
enableLog = true
}
}
适配器
在执行请求之前拦截方法。
import NilNetzwerk
class CustomNetworkClient: NilNetzwerk {
// intercept method
override func adapter(request: inout Request) {
}
}
处理未授权
每个返回 401(未授权)的请求都将被排队到属性 "requestsToRetry",然后执行此方法。
import NilNetzwerk
class CustomNetworkClient: NilNetzwerk {
// Handle unauthorized method
override func handleUnauthorized(request: Request, completion: @escaping (Bool) -> Result<Error>?) {
// You can implement request, refresh token method here
// This is a queue of unauthorized request, you can dequeue and execute request again.
let allRequestsToRetry = self.requestsToRetry
}
}
作者
Nil-Biribiri,[email protected]
许可证
NilNetzwerk 以 MIT 许可证提供。有关更多信息,请参阅 LICENSE 文件。