NilNetzwerk 0.1.2

NilNetzwerk 0.1.2

Nilc.nolan 维护。



  • 作者:
  • NilNilNil

NilNetzwerk

CI Status Version License Platform

一个超轻量级的网络客户端库。高度启发自 Moya,Alamofire。

您可以做什么

  • 进行同步、异步请求。
  • 进行链式请求。
  • 创建自定义网络客户端。
  • 分离构建请求。
  • 在执行前拦截和修改请求。
  • 处理未授权请求(刷新令牌)。
  • 基本认证(Oauth)。
  • 添加 JSON 支持。
  • 网络日志。

示例

要运行示例项目,请克隆仓库,然后从 Example 目录运行 pod install

要求

  • iOS 9.3+
  • Xcode 8.3+
  • Swift 3.2+

安装

NilNetzwerk 通过 CocoaPods 提供。要安装它,只需将以下行添加到 Podfile:

pod 'NilNetzwerk'

用法

创建请求。

创建一个请求

创建自定义 RequestGenerator

执行请求

发送简单的 GET 请求

发送异步请求

发送同步请求

高级用法

创建自定义 NetworkClient

适配器(执行请求前进行拦截)

处理未经授权(如果主机返回 401,则会调用)

发送简单的 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 文件。