ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何用 Alamofire 的 URLRequestConvertible Router 模式组织大量 API 端点?

如何用 Alamofire 的 URLRequestConvertible Router 模式组织大量 API 端点? 如何用 Alamofire 的 URLRequestConvertible Router 模式组织大量 API 端点【免费下载链接】AlamofireElegant HTTP Networking in Swift项目地址: https://gitcode.com/GitHub_Trending/al/Alamofire当 App 里散落的AF.request(https://.../users)越来越多时硬编码的 URL、method、headers 和参数编码很难保持一致改一个接口要翻遍全仓库。Alamofire 把URLSession的请求入口抽象成URLRequestConvertible协议官方文档进一步推荐配合Router设计模式把每个端点收敛成一个类型安全的枚举 case集中管理 URL、方法和参数编码。本文基于仓库中的 AdvancedUsage 和 Usage 文档给出从最小 router、到带参数 router、再到按模块拆分 router 的完整操作路径。先确认你能用 URLRequestConvertible 这个入口Alamofire 的request方法有一个直接接受URLRequestConvertible的重载所有请求参数都封装在这一个值里见 Usageopen func request(_ convertible: any URLRequestConvertible, interceptor: (any RequestInterceptor)? nil, shouldAutomaticallyResume: Bool? nil) - DataRequest协议本身只有一个要求来自 URLConvertibleURLRequestConvertible.swiftpublic protocol URLRequestConvertible: Sendable { func asURLRequest() throws - URLRequest }理解三点asURLRequest()是throws的router 可以在构造URLRequest时做校验或参数编码失败会抛出Error。请求管线第 2 步会调用asURLRequest()生成第一个URLRequest见 请求管线。文档明确 AnyURLRequestConvertiblevalue can create an error whenasURLRequest()is called这正是 router 做前置校验的位置。底层还有URLConvertible协议asURL() throws - URLString、URL、URLComponents默认遵循它用于构造 URL。注意requestModifier闭包只作用于传URL 单独组件的重载不适用于URLRequestConvertible值。文档建议当大多数请求都需要自定义创建时改用URLRequestConvertible。也就是说router 里要自己设置好全部参数。第一步写一个最小的 Router官方文档给出的最小 router 是一个遵循URLRequestConvertible的枚举每个 case 对应一个端点见 AdvancedUsageenum Router: URLRequestConvertible { case get, post var baseURL: URL { return URL(string: https://httpbin.org)! } var method: HTTPMethod { switch self { case .get: return .get case .post: return .post } } var path: String { switch self { case .get: return get case .post: return post } } func asURLRequest() throws - URLRequest { let url baseURL.appendingPathComponent(path) var request URLRequest(url: url) request.method method return request } }这里的baseURL用的是文档示例里的https://httpbin.org实际使用时替换成你自己的 API 根地址。每个端点的 URL、HTTPMethod、路径都集中在这一个类型里。调用它和普通请求一样只是参数变成了枚举 caseAF.request(Router.get)第二步给 router 加上参数编码端点带参数时官方文档推荐用 Alamofire 的ParameterEncoder系列编码器任何Encodable类型都能作为参数enum Router: URLRequestConvertible { case get([String: String]), post([String: String]) var baseURL: URL { return URL(string: https://httpbin.org)! } var method: HTTPMethod { switch self { case .get: return .get case .post: return .post } } var path: String { switch self { case .get: return get case .post: return post } } func asURLRequest() throws - URLRequest { let url baseURL.appendingPathComponent(path) var request URLRequest(url: url) request.method method switch self { case let .get(parameters): request try URLEncodedFormParameterEncoder().encode(parameters, into: request) case let .post(parameters): request try JSONParameterEncoder().encode(parameters, into: request) } return request } }URLEncodedFormParameterEncoder和JSONParameterEncoder都来自 ParameterEncoder.swiftencode(_:into:)会把Encodable参数写进URLRequest。URLEncodedFormParameterEncoder默认destination是.methodDependent即按 HTTP 方法决定参数放 query 还是 body如需固定位置可在创建编码器时传入destination。编码失败会throw最终通过请求管线交给 response handler 或重试逻辑。如何核对 router 生成的请求因为asURLRequest()在管线里生成第一个URLRequest可以用onURLRequestCreation打印出来核对 URL、method 是否符合预期AF.request(Router.post([foo: bar])) .onURLRequestCreation { request in print(request) } .responseDecodable(of: DecodableType.self) { response in debugPrint(response) }DecodableType是文档里通用的占位写法替换成你自己遵循Decodable的响应类型。onURLRequestCreation会在每次为Request创建URLRequest时回调重试时会被调用多次但它不能修改URLRequest——文档指出若要修改应使用RequestInterceptor或在传给 Alamofire 前用URLRequestConvertible自行构造好。如果还要校验服务端响应在 router 发起的请求上追加validate()默认validate()会检查状态码在200..300范围内且响应的Content-Type与请求的Accept匹配。端点变多后拆分 router官方文档的结论是router 可以扩展到任意数量的端点和可配置属性但一旦复杂度过高应把一个大 router 拆成按 API 模块划分的小 router。也就是说Router不是唯一的类型而是可以按业务域组织的一组类型——每加一个模块就新增一个对应的枚举而不必让单个枚举无限膨胀。边界与限制RequestModifier不适用只作用于URL 组件重载不适用于URLRequestConvertible所以 router 要自己设置全部 header、参数、超时等。router 类型必须是Sendable协议要求枚举 case 关联的值需满足该要求。请求管线第 1 步参数封装不会失败但第 2 步asURLRequest()可以失败失败会作为Error进入 response handler 或重试逻辑。端点数量增长后拆分 router 是文档建议的方向不是强制步骤。【免费下载链接】AlamofireElegant HTTP Networking in Swift项目地址: https://gitcode.com/GitHub_Trending/al/Alamofire创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表