创建此包的目的是为您提供一个简单易用的通用网络层,添加到您的项目中。即使您想构建自己的通用网络层,它也会给您一个良好的开端。祝你好运,使用愉快 😉
使用此 API 的目的是使其简单易用。首先,您需要创建一个符合 EndPointProtocol
的 enum
,如下所示
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: Codable
和 public 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与我联系。