通用网络层

example workflow GitHub License SPM compatible

目录

  1. 简介
  2. 如何使用
  3. 测试
  4. 未来更新
  5. 作者

简介

创建此包的目的是为您提供一个简单易用的通用网络层,添加到您的项目中。即使您想构建自己的通用网络层,它也会给您一个良好的开端。祝你好运,使用愉快 😉

如何使用

使用此 API 的目的是使其简单易用。首先,您需要创建一个符合 EndPointProtocolenum,如下所示

enum EndpointMock: EndPointProtocol {
    case validUrl
    
    var scheme: APISchemeType {
      switch self {
      case .validUrl:
          .https
      }
    }
    
    var host: String? {
      switch self {
      case .validUrl:
        return ""
      }
    }
    
    var path: String {
      switch self {
      case .validUrl:
        return ""
      }
    }
    
    var queryItems: [URLQueryItem]? {
      return nil
    }
    
    var urlRequest: URLRequest? {
      guard let url else { return nil }
      let urlRequest = URLRequest(url: url)
      
      switch self {
      case .validUrl:
        return nil
      }
    }
  }

此时,枚举中的每个 case 都代表一个特定的 api 调用。 EndPointProtocol 中的 url 属性有它自己的实现,所以你不需要自己实现。

public extension EndPointProtocol {
  var url: URL? {
    var urlComponents = URLComponents()
    urlComponents.scheme = scheme.rawValue
    urlComponents.host = host
    urlComponents.path = path
    urlComponents.queryItems = queryItems
    
    return urlComponents.url
  }
}

如果您想自定义 url 会话或向请求添加 header,请使用 EndPointProtocol 中的 urlRequest 属性,并根据枚举 case 自定义请求。 然后您就可以使用 GenricNetworkLayer 结构体了。

通用网络层

GenricNetworkLayer 是一个结构体,包含两个函数:public func data<T: Codable>(for endpoint: EndPointProtocol) async throws -> (result: T, statusCode: Int) where T: Codablepublic func data(from endPoint: EndPointProtocol) async throws -> urlDataResult。 它们都以 EndPointProtocol 的实例作为输入。但不同之处在于输出。

第一个函数将从 api 获取数据,然后使用 JsonDecoder 对其进行解码,并在一个元组中输出结果和状态代码。

let resultedData: (result: Int, statusCode: Int) = try! await genericNetworkLayer.data<Int>(for: endPoint)

// This will decode the data after fetching it
// from the api to Int and output
// the result with the status code

第二个函数是为了让您能够拥有自己的解码逻辑,因此它只获取数据,并在一个名为 urlDataResult 的元组中输出数据和状态代码,这是一个类型别名。

let resultedData = try await genericNetworkLayer.data(from: endpoint)

// The resultedData will contain (Data, statuscode) as a tuple

测试

对于测试部分,您需要做的就是创建一个 URlProtocol 的子类来测试 GenricNetworkLayer 的实现。 有关参考,请查看GenericNetworkLayerTests.swift

未来更新

作者

此软件包由 Eng.Omar Elsayed 创建,旨在帮助 iOS 社区并使其生活更轻松。如果您有任何建议,请通过eng.omar.elsayed@hotmail.com与我联系。