FNetworkService 0.2.2

FNetworkService 0.2.2

Anton LoginovEugeneEO 维护。



  • 作者:
  • Eugene

特性

  • 灵活
  • 闭包 API
  • 可编码/可解码响应
  • 易于构建请求
支持
  • HTTP 请求;
  • 带有响应缓存的 HTTP 请求;
  • 上传 HTTP 请求

目录

  1. 用法
  2. 设置
  3. 日志写入器
  4. 构建端点
  5. 扩展 NetworkService
  6. 替换
  7. 类型别名
  8. 构建所用
  9. 作者
  10. 许可协议

用法

pod 'FNetworkService'

struct AnyResponse: Decodable/Codable { /*...*/ }
let networkService = NetworkService()
networkService.request(endpoint: EndpointProtocol, completion: <(Result<Decodable, APIError>) -> Void>)

为了明确指定 Codable 类型,在使用 completion 块时使用 public typealias APIResult<Model> = Swift.Result<Model, APIError>

networkService.request(endpoint: EndpointProtocol) { [weak self] (result: APIResult<Data>) in
    // handle response
}
        
networkService.request(endpoint: EndpointProtocol, isCahingEnabled: Bool) { [weak self] (result: APIResult<AnyResponse>) in
    // handle response
}
        
networkService.request(endpoint: EndpointProtocol, isCahingEnabled: Bool) { ([weak self] (result: APIXResult<AnyResponse>) in
    // handle response
}

设置

每个 NetworkService 实例将使用以下设置

NetworkService.Settings.defaultLogger: NetworkLogsWriter? // DebugLogWriter by default
NetworkService.Settings.defaultRequestSettings: RequestSettingsProtocol //  RequestSettings by default. It contains additionalHeaders which is nil by default. They will be merged with Endpoint's headers, if set.

设置 NetworkService 实例

let settings: NetworkService.Setting = .default
settings.validCodes: Range<Int> = ..                                    // (200 ..< 300) by default
settings.cacheRequestTimeout: TimeInterval = ...                        // 0.3 by default
settings.requestTimeout: TimeInterval = ...                             // 10 by default
settings.completionQueue: DispatchQueue = ...                           // .main by default
settings.dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = ...   // JSONDecoder.DateDecodingStrategy.millisecondsSince1970 by default
settings.requestSettings: RequestSettingsProtocol = ...                 // Settings.defaultRequestSettings by default
settings.networkLogger: NetworkLogsWriter? = ...                        // Settings.defaultLogger by default

let configuratedNetworkService = NetworkService(settings: settings)

日志写入器

更改调试日志行为

// .all by default
// Options: .none; .onSuccess; .onError; .all
NetworkService.Settings.defaultDebugLogger.writeOptions = .none

实现您的目的的日志写入器

class MyLogWriter: NetworkLogsWriter {
    var writeOptions: LoggerWriteOptions { get set }
    func write(log: String)
    
    // With default implemetation
    var dateLocale: Locale { get } // default is "en_US"
    func write<T>(endpoint: EndpointProtocol, result: APIResult<T>)
}

NetworkService.Settings.networkLogger = MyLogWriter()

构建端点

结构示例

struct ProfileEnpoint: EndpointProtocol {

    init(id: String) { self.id = id }

    let baseUrl: URL? = URL(string: "https://www.myprofile.com/")
    let path: String = "pofile"
    let method: HTTPMethod = .get
    let parameters: Parameters? = ["id": id]
}

枚举示例

enum GoogleEndpoint: EndpointProtocol {
    case main
    case search(path: String)
    
    var baseUrl: URL? { return URL(string: "https://www.google.com/") }
    var method: HTTPMethod { return .get  }
    var parameters: Parameters? { return nil }
    
    var path: String {
        switch self {
        case .main:              return ""
        case .search(let path):  return path
        }
    }
    
}

EndpointProtocol默认属性,请参考以下代码了解详细信息

var encoding: ParameterEncoding
var headers: HTTPHeaders?
var cacheKey: String?

扩展NetworkService

class MyNetworkService: NetworkService

    init(settings: NetworkService.Settings = Settings.default) {
        
        settings.requestSettings.additionalHeaders = ["MyHeaderKey": "MyheaderValue"]
        
        if (debug) {
            settings.debugLogger?.writeOptions = .none
        }
        
        super.init(settings: settings)
    }
    
    override func request(endpoint: EndpointProtocol, completion: @escaping (APIResult<Data>) -> Void) {
        myUsefulMethod()
        super.request(endpoint: endpoint, completion: completion)
    }
    
    // triggers after response comes
    override func parse(response: DefaultDataResponse, forEndpoint endpoint: EndpointProtocol) -> APIResult<Data> {
        anotherUsefulMethod()
        return super.parse(response: response, forEndpoint: endpoint)
    }

替换

var networkService: NetworkServiceProtocol = NetworkService()
networkService = MyNetworkService()

类型别名

public typealias NetworkServiceProtocol = NetworkRequestable & ResponseParser

public typealias Parameters = [String: Any]
public typealias HTTPHeaders = [String: String]
public typealias HTTPMethod = Alamofire.HTTPMethod

public typealias APIResult<Model> = Swift.Result<Model, APIError>
public typealias APIXResult<Model> = Swift.Result<ModelWithResponse<Model>, APIError>

由以下构建

作者

FNetworkService 由 Alexandr Antonov 开发。由 Eugene Orekhin 扩展和部署。

许可证

本项目的许可协议为MIT协议 - 详细信息请参阅LICENSE.md文件