Alamofire RequestAdapter - изменить URL - PullRequest
0 голосов
/ 15 января 2019

У меня есть приложение, которое связывается с физическими устройствами, каждое из которых предоставляет свой собственный 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
    }
}

К сожалению, когда я просматриваю журналы Чарльза, Alamofire отправляет два запроса одновременно , один с исходным URL-адресом, а другой с измененным URL-адресом (и измененными заголовками). Как это исправить? Нужно ли создавать новый SessionManager для каждого из этих устройств?

EDIT: Код для создания запросов:

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
    }
}

1 Ответ

0 голосов
/ 13 марта 2019

В итоге я реорганизовал код, чтобы у каждого устройства был свой менеджер сеансов. Очевидно, вы не можете изменить URL-адрес запроса, используя RequestAdapter.

...