- 下面就来学习如何 使用路由来发起请求
// Alamofire 有这样一个 接口用来发起请求 只传递一个 参数 urlRequest
public func request(_ urlRequest: URLRequestConvertible) -> DataRequest {
return SessionManager.default.request(urlRequest)
}
2、我们来看一下 URLRequestConvertible 是什么类型的
public protocol URLRequestConvertible {
func asURLRequest() throws -> URLRequest
}
-
很明显,通过上面的代码可以看出是一个 协议类型的,内部返回了一个 URLRequest,这时候我们可以大胆的猜测,当Alamofire 发起请求时候 一定调用了 asURLRequest() 这个函数来获取 URLRequest
-
下面我们就创建一个枚举类型的并继承和实现 URLRequestConvertible 协议
enum Route : URLRequestConvertible {
static let baseUrl = "http://localhost/" //这是baseUrl
//假设我们要请求用户信息
case userInfo
//修改用户名
case changeName([String:Any]?)
func asURLRequest() throws -> URLRequest
return ……
}
}
- 需要构造 很显然 URLRequest 我们来看下都需要传递那些参数
// 参数1 URL 参数2 缓存策略 默认为
public init(url: URL, cachePolicy: URLRequest.CachePolicy = .useProtocolCachePolicy, timeoutInterval: TimeInterval = 60.0)
第一个参数:URL 第二个参数: URLRequest.CachePolicy 这里使用默认的
public enum CachePolicy : UInt {
case useProtocolCachePolicy = 0
case reloadIgnoringLocalCacheData = 1
case reloadIgnoringLocalAndRemoteCacheData = 4
public static var reloadIgnoringCacheData: NSURLRequest.CachePolicy { get }
case returnCacheDataElseLoad =
case returnCacheDataDontLoad = 3
case reloadRevalidatingCacheData = 5
}
第三个参数 请求超时时间 默认为 60s
- 设置 URLRequest 请求方式
/// The HTTP request method of the receiver.
public var httpMethod: String? //请求方法
/// A dictionary containing all the HTTP header fields of the
/// receiver.
public var allHTTPHeaderFields: [String : String]? //请求头
…………
- 使用 格式化请求体
let encodning = JSONEncoding.default
try encodning.encode(request,with: params)
- 结果为:
enum Route : URLRequestConvertible {
static let baseUrl = "http://localhost/" //这是baseUrl
//假设我们要请求用户信息
case userInfo
//修改用户名
case changeName([String:Any]?)
func asURLRequest() throws -> URLRequest
var method : HTTPMethod {
switch self {
case . userInfo:
return .get
case . changeName:
return .post
}
}
var params:[String : Any]?{
switch self {
case . userInfo:
return nil
case . changeName(let params) :
return params
}
}
var url:URL {
var relativeURL = "app/"
switch self {
case .userInfo:
relativeURL += "user_info.php"
case . changeName:
relativeURL += "change_name.php"
}
let url = URL(string:RequestRoute.baseUrl)!.appendingPathComponent(relativeURL)
return url
}
let encoding = JSONEncoding.default
return try encoding.encode(request,with: params)
}
}
- 如何发起请求?
request(.userInfo).responseJSON(completionHandler: {
response in
guard response.result.error == nil else { return }
guard let json = response.result.value as? [String:Any] else { return }
print(json)
).resume()
- post 传递参数 路由类似 不做演示