正如Sulthan所建议的那样,当您希望在POST数据中包含某些符号字符时,实际的服务器不能使用预定义的CharacterSet
。
一个例子CharacterSet
,我经常使用:
extension CharacterSet {
static let rfc3986Unreserved = CharacterSet(charactersIn:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~")
}
let postValue = "(1&*^&&2"
let postString = "app_log_pass=\(postValue.addingPercentEncoding(withAllowedCharacters: .rfc3986Unreserved)!)"
print(postString) //->app_log_pass=%281%26%2A%5E%26%262
另一个CharacterSet
这将对于通常PHP服务器的工作:
extension CharacterSet {
static let queryValueAllowed = CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "&+="))
}
let postValue = "(1&*^&&2"
let postString = "app_log_pass=\(postValue.addingPercentEncoding(withAllowedCharacters: .queryValueAllowed)!)"
print(postString) //->app_log_pass=(1%26*%5E%26%262
无论如何,你需要单独逃生的关键和价值,防止逃离分离器=
。
ADDITION
逸出多个键 - 值对的一个示例:
extension String {
var queryValueEscaped: String {
return self.addingPercentEncoding(withAllowedCharacters: .queryValueAllowed)!
}
}
let params: [String: String] = [
"app_log_usn": "OOPer",//usn_text_field.text!,
"app_log_pass": "(1&*^&&2"//pass_text_field.text!
]
let postString = params.map {"\($0.key)=\($0.value.queryValueEscaped)"}.joined(separator: "&")
print(postString) //->app_log_usn=OOPer&app_log_pass=(1%26*%5E%26%262
假设每个键由安全字符和无需逸出。
https://en.wikipedia.org/wiki/Percent-encoding – Alexander
@Alexander添加'addingPercentEncoding'没有帮助。 – sakoaskoaso
这对我来说非常惊奇。你在哪里使用它? – zneak