http 协议 必备要素
- URL
- method
- header
- body
- query parameters
构建URLRequest
- 拼接URL: baseURL + relativeURL + query parameters
- set header
- set body
抽象层协议 URLRequestConvertible protocol
public protocol URLRequestConvertible {
/// Returns a URL request or throws if an `Error` was encountered.
///
/// - throws: An `Error` if the underlying `URLRequest` is `nil`.
///
/// - returns: A URL request.
func asURLRequest() throws -> URLRequest
}
用户层 协议示范
public protocol MFURLRequestConvertible: URLRequestConvertible {
var baseURL: URL { get }
var path: String { get }
var method: HTTPMethod { get }
var headers: Header { get }
var parameter: MFParameter { get }
var queryParameterEncoding: ParameterEncoding { get }
}
public enum MFParameter {
case url(Parameters)
case body(Parameters, encoding: ParameterEncoding)
case mix(url: Parameters, body: (Parameters, encoding: ParameterEncoding))
}
这样协议详细描述URLRequest, 这里要注意的是参数的编码方式,这个真的很重要。通常情况get方法的参数以查询字符串拼接,post
以json格式出现。但有的时候就是很奇葩,我就碰到过get方法以json字符串拼接的,post方法以查询字符串拼接的,真的是要吐血。所以应当配置参数的编码方式
好了有了这个协议现在可以愉快的编码了,已经能够快速便捷的构建http请求(暂不包括upload 和download method),但这仅仅是解决单个http请求,
如果要构建多个http请求,你需要建立一个路由表, 可以参照开源框架:Moya或者自己尝试使用枚举创建路由表