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