Alamofire RequestAdapter - 修改URL

问题描述 投票:0回答:1

我有一个与物理设备通信的应用程序,每个应用程序都提供自己的通信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
    }
}
ios swift alamofire
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.