Alamofire RequestAdapter - 修改 URL

Posted

技术标签:

【中文标题】Alamofire RequestAdapter - 修改 URL【英文标题】:Alamofire RequestAdapter - modify URL 【发布时间】:2019-01-15 08:48:10 【问题描述】:

我有一个与物理设备通信的应用程序,每个设备都提供自己的通信 URL。

class Device 
    let commsUrl: URL
    let serialNo: String

对于与这些设备相关的所有请求(在我自己的框架中),我有一个通用的 Alamofire SessionManager。正在向 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
    

【问题讨论】:

不确定我是否完全理解您在这里使用多个设备执行的操作?也很高兴看到您的代码发出请求的样子。 我只是在正文中使用适当的 JSON 向他们发送命令(例如,开始工作),但为了能够做到这一点,我必须使用设备提供给我的 URL(我有没办法设置)。 你的代码中有sessionManager.adapter = DeviceRequestAdapter(device: device)这样的东西吗? 不,因为我创建了我的网络类以拥有一个通用会话管理器。我是否必须重构它并为每个设备创建单独的管理器...? 【参考方案1】:

最后我重构了代码,让每个设备都有自己的会话管理器。显然您不能使用 RequestAdapter 更改请求的 URL。

【讨论】:

以上是关于Alamofire RequestAdapter - 修改 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 的 RequestAdapter 将 firebase ID 令牌设置为全局标头?

了解 AlamoFire OAuth 示例

Alamofire 是不是支持 HTTP 流水线?

在 Alamofire 的请求适配器中添加 GET 参数

Swift 3 的 ObjectMapper 和 Alamofire 问题 Alamofire 4 的 Alamofire 版本

导入 Alamofire 3.4 - 没有这样的模块“Alamofire”