Swift: невозможно добавить строку формата .prettyPrinted в forHTTPHeaderField - PullRequest
1 голос
/ 14 июня 2019

Продолжая из этого вопроса ,

Я пытаюсь преобразовать [String : Any] в String и затем передать это String в forHTTPHeaderField

Попытка 1: Без симпатичной

let encoder = JSONEncoder()

if let json = try? encoder.encode(jsonDict) {
   convertedString = String(data: json, encoding: .utf8)!
}

print("JsonStringFormat     ", convertedString )

let url = NSURL(string: getMenuURL)
let request = NSMutableURLRequest(url: url! as URL)
request.setValue(convertedString, forHTTPHeaderField: "SessionInfo")

print("\nHEADer__reQQ__    ", request.allHTTPHeaderFields)

ВЫХОД:

JsonStringFormat      {"Token":"96FFC5B994514B3D","UICulture":"en-CA ","LanguageCode":"ENG","CompanyID":"QAP","IMEINo":"1jzBG3TSrMzj\/tKihlEv8g=="}
HEADer__reQQ__     ["SessionInfo": "{\"Token\":\"96FFC5B994514B3D\",\"LanguageCode\":\"ENG\",\"UICulture\":\"en-CA \",\"CompanyID\":\"QAP\",\"IMEINo\":\"1jzBG3TSrMzj\\/tKihlEv8g==\"}"]

Попытка 2: С печатью .pretty

let encoder = JSONEncoder()

// ADDING PRETTY FORMAT
encoder.outputFormatting = .prettyPrinted

if let json = try? encoder.encode(jsonDict) {
   convertedString = String(data: json, encoding: .utf8)!
}

print("PrettyJsonStringFormat     ", convertedString )

let url = NSURL(string: getMenuURL)
let request = NSMutableURLRequest(url: url! as URL)
request.setValue(convertedString, forHTTPHeaderField: "SessionInfo")

print("\nPrettyHeader__    ", request.allHTTPHeaderFields)

ВЫХОД:

PrettyJsonStringFormat      {
  "Token" : "70E277954143414A",
  "UICulture" : "en-CA ",
  "LanguageCode" : "ENG",
  "CompanyID" : "QAP",
  "IMEINo" : "1jzBG3TSrMzj\/tKihlEv8g=="
}

PrettyHeader__    [:]

Если я использую попытку 1, к этому значению добавляется BackSlash \.Чтобы избежать этого, я иду с попыткой 2, [Pretty Printed].

Я не знаю, почему request.allHTTPHeaderFields не имеет добавленных значений заголовка.

Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Вы должны проверить этот ответ в этой ссылке

Ваше понимание стандарта верно. В прошлом значения многострочных заголовков поддерживались в RFC 2616 . Эта функция была известна как «Линия складывания»:

Значения полей заголовка HTTP / 1.1 можно сложить на несколько строк, если строка продолжения начинается с пробела или горизонтальной табуляции. Все линейные пробелы, включая складывание, имеют ту же семантику, что и SP. Получатель МОЖЕТ заменить любой линейный пробел одним SP перед интерпретацией значения поля или пересылкой сообщения в нисходящем направлении.

0 голосов
/ 14 июня 2019

Это потому, что convertedString в Attempt2 имеет несколько строк.

RFC говорит, что значение поля заголовка с несколькими строками не рекомендуется.

Исторически сложилось,Значения полей заголовка HTTP могут быть расширены на несколько строк путем добавления каждой дополнительной строки по крайней мере к одному пробелу или горизонтальной табуляции (obs-fold).Эта спецификация не поддерживает такое свертывание строк, кроме как в типе носителя message / http (Раздел 8.3.1).Отправитель НЕ ДОЛЖЕН генерировать сообщение, которое включает в себя перенос строки (т. Е. Имеет любое значение поля, которое соответствует правилу obs-fold), если только это сообщение не предназначено для упаковки в типе сообщения / http media.

И, setValue(_:forHTTPHeaderField:), похоже, игнорирует такие значения.

// This does nothing. Just ignoring the value "A\nB"
request.setValue("A\nB", forHTTPHeaderField: "C")

Кроме того, обратная косая черта в Attempt1 не будет иметь проблем.Сервер, получивший запрос, будет правильно обрабатывать значение.

...