Swift:无法将.prettyPrinted格式的字符串添加到forHTTPHeaderField

时间:2019-06-14 07:20:13

标签: swift nsmutableurlrequest nshttpurlresponse

通过继续from this question

我正在尝试将[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 个答案:

答案 0 :(得分:1)

您应该在此link

中查看此答案

您对标准的理解是正确的。过去,RFC 2616支持多行标头值。此功能称为“折线”:

  如果连续行以空格或水平制表符开头,则

HTTP / 1.1标头字段值可以折叠到多行上。所有线性空白(包括折叠)都具有与SP相同的语义。接收者可以在解释字段值或向下游转发消息之前,用单个SP替换任何线性空格。

答案 1 :(得分:0)

这是因为convertedString中的Attempt2有多行。

RFC表示已弃用具有多行的标头字段值。

  

从历史上看,HTTP标头字段值可以扩展到     多行,在每条额外行之前至少留一个空格     或水平制表符(折叠)。本规范不赞成这样     换行,但在message / http媒体类型中除外     (第8.3.1节)。发件人不得生成包含以下内容的消息     行折叠(即具有任何字段值且包含与     折叠规则),除非该消息是用于包装的     在message / http媒体类型中。

而且,setValue(_:forHTTPHeaderField:)似乎忽略了这些值。

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

此外,Attempt1中的反斜杠将没有问题。接收请求的服务器将正确处理该值。