2017年09月01日10:20:20 该文档已废弃,网络请求V2已重写,暂未提供新文档
TSNetwork 负责整个应用所有基于Http
协议的信息传输.
.
├── NetworkManager : 模块的网络请求管理
│ ├── NetworkModel : 网络请求数据模型
│ │ └── TSAccountTokenModel.swift
│ └── TSAccountNetworkManager.swift
├── NetworkURLPath : 网络请求路径记录
│ └── TSNetworkURLPath.swift
├── ServerErrorMessage.plist : 服务器端定义的错误码
└── TSNetwork.swift : 基础的网络请求处理
**注意:**网络模块的测试代码目录在:./Thinksns PlusTests/NetworkTest/
TSNetwork 基于以下 3 层来分布相关的功能.
- 第一层: TSNetwork.h
通过 TSNetwork 类负责和网络框架通讯,处理服务器返回的数据(
gzip
解压,服务器返回数据头信息处理等). 正确时,将服务器返回的信息(message)
和数据(data)
统一打包反馈给下一层. 服务器抛出错误时,将服务器返回的错误打包成TSRequestServerErrorDomain
的错误(NSError)
返回给下一层. 网络请求错误时,直接将应用层的错误(NSURLErrorDomain)
传递给一层.
**注意:**当日志输出格式设置为verbose
时,每次网络请求前的参数和请求到参数都会打印输出到控制台.
-
第二层: TSFutureNetworkManager.h 通过建立多个类似
TSFutureNetworkManager.h
的类,依照功能或者UI
页面对部分功能或者UI
页面下的网络请求进行统一归类和处理. 该类负责组织处理网络请求时所需的参数,将打包好的传递给TSNetwork
,同时按照不同的接口要求对接收TSNetwork
返回的数据类型处理. 正确的数据转换为DataModel
类交给下一层,或者对TSNetwork
返回的错误信息统一读取,并且处理后反馈给下一层. -
第三层: UIViewController.h 负责处理页面的逻辑的控制器只需要和
TSFutureNetworkManager
等网络请求管理类交互,通过调用网络请求管理类,可以有效减少页面上冗余的代码,增加代码的自解释性,并且可以方便后续编写测试用例方便的对各个TSFutureNetworkManager
进行测试等操作.
在需要的地方(建议在系统启动时)配置网络请求的根地址和常用参数.
let noteworkManager = TSNetwork.sharedInstance
noteworkManager.configRootURL(rootURL: TSURLPath.root.rawValue)
网络管理类统一按照以下格式命名TS功能或者页面名称NetworkManager
,例如TSAccountNetworkManager
就表示该类负责处理所有的首页网络请求管理.
网络管理类建议统一使用类方法命名,例如:
// 登录方法
TSAccountNetworkManager().login(phoneNumber: "15928856596", password: "123456", testKey: TSTestRequestServer.ParameterKey.success, finish: {info, error in
result = info!
resultToken = TSAccountTokenModel()!.token
})
为了保持调用代码时的一致性,接口回调的参数统一通过finish
的info
和error
参数返回.
注意
网络管理类返回参数时,建议尽量少的返回信息.必要时再统一返回modle
.
编写网络管理类时,需要遵循面向对象的原则:该类只编写/处理和该类相关的代码.
也就是说网络请求管理类,就不要处理和网络请求以外的事情,也不能将控制器中处理的需要的多个网络请求嵌套调用编写到网络请求管理类中.(比如:充值控制器需要先发起一个网络请求创建订单再前一个网络请求正常后,再发起一个网络请求检查订单支付结果.在处理类似的情况时,需要在网络请求管理类中编写对应的 2 个网络请求方法,然后在控制器中去嵌套调用.而不是只编写一个充值的网络请求接口,在内部对逻辑进行过多的处理,导致代码可读性差,方法单一性过低)
在上面的示例代码中,数据模型TSAccountTokenModel
记录了所有和应用相关的配置信息,在编译数据模型类时,建议统一使用SwiftyJSON
来负责数据模型处理.
示例代码:
import SwiftyJSON
extension TSAccountTokenModel {
/// 通过服务器返回的数据初始化
init(json: [String: Any]) {
let jsonData = JSON(json).dictionaryValue
self.token = jsonData["token"]!.string!
self.createdAt = jsonData["created_at"]!.int!
self.expires = jsonData["expires"]!.int!
self.refreshToken = jsonData["refresh_token"]!.string!
self.list = [self.token, self.createdAt, self.expires, self.refreshToken]
}
}
完成以上对象的编写后,最后一步是在control
中的调用.控制器如果功能比较简单,逻辑处理少时,直接在控制器中调用.如果控制器比较复杂,则建议在子控制器或者子视图中调用网络请求管理类.
错误信息处理
当UI层调用网络请求管理类时,需要使用错误信息时,可以直接通过open var localizedFailureReason: String? { get }
方法,获取底层错误的对应的错误信息.但是,需要注意的是,如果该错误的错误域不等于TSNetwork.sharedInstance.errorDomain
时,对应的错误信息不建议直接显示到UI.
示例代码:
var errorMessage: String? = nil
var errorInfo: String? = nil
var errorCode: Int? = nil
var errorDomain: String? = nil
TSNetwork.sharedInstance.textRequest(method: .get, path: "Mock", parameter: nil) { (responeInfo, responeData, error) in
errorInfo = error?.localizedFailureReason // 错误对应的文本信息
errorMessage = responeInfo // 底层响应信息
errorCode = error?.code // 错误码
errorDomain = error?.domain // 错误域
}