NSMutableUrlRequest 吃掉了加号

5

我创建了一个NSMutableUrlRequest用于向服务器发送数据,添加了所有必要的字段,然后像这样添加了用于发送的字符串:

[theRequest setHTTPBody:[postString dataUsingEncoding: NSUTF8StringEncoding]];

postString是一个普通的NSString。

问题是,当我在服务器上接收到这个请求时,所有加号(+)都从http正文中消失了。所以如果我在iPhone上有“abcde+fghj”,那么我在服务器上得到的是“abcde fghj”。

这可能是使用dataUsingEncoding: NSUTF8StringEncoding时的编码问题吗?或者是NSMutableUrlRequest剥离特性?我该怎么做才能停止剥离加号?我需要在服务器端接收UTF8字符串。

3个回答

4

在URL的查询字符串部分中,加号(+)是表示空格的标准快捷方式。如果你想要一个字面上的加号,可以将其编码为%2b。


我不否认你的答案,但这只有在字符串通过方法 stringByAddingPercentEscapesUsingEncoding: 传递而不仅仅是使用 UTF8 进行编码时才会发生,对吗? - Jasarien
2
谢谢,现在我明白了。看起来我需要先通过stringByAddingPercentEscapesUsingEncoding:运行我的字符串,然后我需要运行它通过replaceOccurrencesOfString:@"+" withString:@"%2B"和其他几个替换不同的字符,因为stringByAddingPercentEscapesUsingEncoding:不能转义所有字符。 - Mike

0

可能是服务器不知道POST请求体的编码方式。 您是否尝试在请求头中添加charset=UTF-8,像这样:

[theRequest setValue:@"application/x-www-form-urlencoded; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];

谢谢,我之前有使用application/x-www-form-urlencoded,但没有使用charset=UTF-8,现在我已经添加了。 - Mike
更新:仅添加“application/x-www-form-urlencoded; charset=UTF-8”并没有帮助,我仍然需要将字符替换为%值,整个POST正文需要进行大量编码... - Mike

0
例如,您需要使用 "Content-Type" -> "application/x-www-form-urlencoded"data 发送到后端。

application/x-www-form-urlencoded:键和值以 key-value 元组的形式编码,由“&”分隔,并在键和值之间使用“=”。键和值中的非字母数字字符都是百分比编码的:这就是为什么此类型不适用于二进制数据(请改用 multipart/form-data)的原因。

参考

您可以通过在 Swift 中将函数 addingPercentEncoding 应用于字符串来进行百分比编码。
guard let jsonString = String(data: jsonData, encoding: .utf8)?.addingPercentEncoding(withAllowedCharacters: .alphanumerics) else {
   failureCompletion()
   return
}

var request = URLRequest(url: url)
...
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpBody = "jsonString".data(using: .utf8)
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接