Установите заголовки с вложенным ключом-значением в Alamofire

Я пытаюсь установить заголовки запроса Alamofire 4, где заголовки имеют ключ, значение которого является другой парой ключ-значение. Компилятор Swift доволен моими переменными заголовка, но Alamofire их не примет.

Вот что у меня есть:

 let subHeader = [
  "some-key": "some-value",
  "another-oey": "another-value"
  ]

let headers : [String: Any] = [
  "some-header-key": "some-header-value",
  "subdata": [subHeader]
  ]

// Upload data                  
Alamofire.upload(data,
   to: uploadurl,
   method: .put,
   headers: headers)
   .validate()
   .response { response in
   // Handle response
 }

person BlueBoy    schedule 11.04.2017    source источник
comment
Проверьте этот stackoverflow.com/questions /41294012/   -  person Sivajee Battina    schedule 11.04.2017
comment
@SivajeeBattina Это помогает, но не совсем, потому что они используют стороннюю библиотеку SwiftyJson.   -  person BlueBoy    schedule 11.04.2017
comment
Да. Вы не хотите использовать SwiftyJSon?   -  person Sivajee Battina    schedule 11.04.2017
comment
Пожалуйста, проверьте также эту ссылку: github.com/Alamofire/Alamofire/issues/896   -  person Sivajee Battina    schedule 11.04.2017
comment
@SivajeeBattina Просто дополнительная библиотека, которая мне не нужна в моем приложении, потому что эта маленькая вещь кажется расточительной. И спасибо за эту другую ссылку, но я только что попробовал и та же проблема - не работает.   -  person BlueBoy    schedule 11.04.2017
comment
Я думаю, вы хотите использовать parameters вместо headers.   -  person Dave Weston    schedule 11.04.2017
comment
@DaveWeston Тоже пробовал. Не работает.   -  person BlueBoy    schedule 11.04.2017
comment
Что вы не передаете одно значение в формате string-json ключу вашего заголовка и десериализуете его в своем бэкэнде?   -  person William Kinaan    schedule 12.04.2017
comment
@WilliamKinaan Потому что серверная часть может получить доступ только к заголовкам в subdata.   -  person BlueBoy    schedule 12.04.2017


Ответы (1)


Если вы посмотрите на исходный код Alamofire, вы можно увидеть, что HTTPHeaders на самом деле [String: String]. По сути, Alamofire ожидает от вас [String: String] как headers.

Что вы можете сделать, так это преобразовать subheader в String с помощью NSJSONSerialization и передать его Alamofire.

let dictData = try! JSONSerialization.data(withJSONObject: subheader)
let dictString = String(data: dictData, encoding: String.Encoding.utf8)!
print(dictString)
// Now use "dictString" instead of "subheader" in your "headers" dictionary

Вы можете выполнять обработку ошибок, как хотите, я использовал !s для простоты.

person Mert Buran    schedule 11.04.2017