Alamofire 如何使用路由发起请求

105 阅读2分钟
  • 下面就来学习如何 使用路由来发起请求
// 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 传递参数 路由类似 不做演示