ios - Alamofire RequestAdapter - 修改 URL
问题描述
我有一个与物理设备通信的应用程序,每个设备都提供自己的通信 URL。
class Device {
let commsUrl: URL
let serialNo: String
}
SessionManager
对于与这些设备相关的所有请求,我有一个通用的 Alamofire (在我自己的框架中)。请求被提供给 Alamofire RequestAdapter 子类:
class DeviceRequestAdapter: RequestAdapter {
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequestModified = URLRequest(url: device.commsUrl)
// set headers etc...
return urlRequestModified
}
}
不幸的是,当我查看 Charles 日志时,Alamofire 同时发送两个请求,一个带有原始 URL,另一个带有修改后的 URL(和修改的标头)。如何解决这个问题?我需要为这些设备中的每一个创建一个新的 SessionManager 吗?
编辑:创建请求的代码:
func request(device: Device, command: Device.Command) -> URLRequest? {
let rawRequest = DeviceCommandRequest(command: command, url: device.commsUrl) //sets appropriate endpoint and JSON content
guard let dataRequest = try? rawRequest.dataRequest(), //dataRequest() is a convenience function to create a request using SessionManager
let urlRequest = dataRequest.request
else {
return nil
}
let adapter = DeviceRequestAdapter(device: device)
return try? adapter.adapt(urlRequest)
}
适配器:
class DeviceRequestAdapter: RequestAdapter {
private func adaptURL() -> URL? {
// return modified URL based on Device url and serialNo
}
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
guard let body = urlRequest.httpBody, let url = adaptURL() else {
return urlRequest
}
var newRequest = URLRequest(url: url)
newRequest.setValue("something", forHTTPHeaderField: "headerField") //and other modifications
return newRequest
}
}
解决方案
最后,我重构了代码,使每个设备都有自己的会话管理器。显然您不能使用RequestAdapter
.
推荐阅读
- vmware-clarity - 如何使用清晰度自定义 clrdgfilter 的位置?
- c# - JANUS GridEX:如何按不同列 C# 的值对某些列进行排序
- java - 当我尝试使用 selenium 在 Firefox 中使用 google 搜索结果填充列表时,该列表为空
- postgresql - 如何将 PostGIS ST_Within 应用于列中的所有行
- c - 对于素数和非素数,程序没有按预期工作
- javascript - 如何将子元素附加到 React 元素?
- python - 如何在 df 中保留 dtype('o') 而不是 bool
- azure - 从 Azure DevOps 运行 dotCover 时出错
- excel - Text in "Values" of Pivot Table fields
- couchdb - CoachDb limit between two values