特性
- 灵活
- 闭包 API
- 可编码/可解码响应
- 易于构建请求
支持
- HTTP 请求;
- 带有响应缓存的 HTTP 请求;
- 上传 HTTP 请求
目录
用法
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文件