斯威夫特如何发送的符号,如“&(*(”与HTTP后
我有这个斯威夫特代码斯威夫特如何发送的符号,如“&(*(”与HTTP后
var request = URLRequest(url: URL(string: "http://www.centill.com/ajax/logreg.php")!)
request.httpMethod = "POST"
let postString = "app_log_pass=\(pass_text_field.text!)"
request.httpBody = postString.data(using: .utf8)
而当我的文字是 (1&*^&&2
它只打印(1
我。怎么可以发送字符串包含各种符号安全与斯威夫特
正如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
假设每个键由安全字符和无需逸出。
但是如果我有两个发布像这样的'app_log_usn = \(usn_text_field.text!)&app_log_pass = \(pass_text_field.text!)'的值'那么它也会逃脱'&'不是吗? – sakoaskoaso
@sakoaskoaso,就像我的回答_yo你需要分别逃避关键和价值。例如:'app_log_usn = \(usn_text_field.text!.addingPercentEncoding(withAllowedCharacters:.queryValueAllowed)!)&app_log_pass = \(pass_text _field.text!.addingPercentEncoding(withAllowedCharacters:.queryValueAllowed)!)'。 (它太长了,你最好分成多个语句,或者定义你自己的扩展名。) – OOPer
顺便说一句,你也可以使用'URLComponents'来构建你的URL。它唯一的问题是它不编码'+'字符。 – Sulthan
使用addingPercentEncoding方法与urlHostsAllowed参数:
string.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
'postString = postString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)!'不起作用。 – sakoaskoaso
转换后,什么是postString?你的意思是什么没有奏效? – AlexDrenea
'(1&*%5E && 2'但是当我打印HTTP请求的结果时它仍然返回'(1' – sakoaskoaso
https://en.wikipedia.org/wiki/Percent-encoding – Alexander
@Alexander添加'addingPercentEncoding'没有帮助。 – sakoaskoaso
这对我来说非常惊奇。你在哪里使用它? – zneak