1

通过继续这个问题

我正在尝试转换[String : Any]String然后将其传递StringforHTTPHeaderField

尝试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没有添加标题值。

请指导我。

4

2 回答 2

1

您应该在此链接中检查此答案

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

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

于 2019-06-15T11:12:10.400 回答
0

那是因为convertedStringinAttempt2有多行。

RFC表示不推荐使用具有多行的标头字段值。

从历史上看,HTTP 标头字段值可以通过在每一额外行之前至少一个空格或水平制表符(obs-fold)来扩展多行。除了在 message/http 媒体类型(第 8.3.1 节)中,本规范不赞成这种行折叠。发送者不得生成包含行折叠的消息(即,具有包含与 obs-fold 规则匹配的任何字段值),除非该消息旨在包装在 message/http 媒体类型中。

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

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

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

于 2019-06-14T10:36:13.117 回答