2017-07-25 37 views
2

我有这个斯威夫特代码斯威夫特如何发送的符号,如“&(*(”与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我。怎么可以发送字符串包含各种符号安全与斯威夫特

+0

https://en.wikipedia.org/wiki/Percent-encoding – Alexander

+0

@Alexander添加'addingPercentEncoding'没有帮助。 – sakoaskoaso

+0

这对我来说非常惊奇。你在哪里使用它? – zneak

回答

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 

假设每个键由安全字符和无需逸出。

+1

但是如果我有两个发布像这样的'app_log_usn = \(usn_text_field.text!)&app_log_pass = \(pass_text_field.text!)'的值'那么它也会逃脱'&'不是吗? – sakoaskoaso

+0

@sakoaskoaso,就像我的回答_yo你需要分别逃避关键和价值。例如:'app_log_usn = \(usn_text_field.text!.addingPercentEncoding(withAllowedCharacters:.queryValueAllowed)!)&app_log_pass = \(pass_text _field.text!.addingPercentEncoding(withAllowedCharacters:.queryValueAllowed)!)'。 (它太长了,你最好分成多个语句,或者定义你自己的扩展名。) – OOPer

+0

顺便说一句,你也可以使用'URLComponents'来构建你的URL。它唯一的问题是它不编码'+'字符。 – Sulthan

-1

使用addingPercentEncoding方法与urlHostsAllowed参数:

string.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

+0

'postString = postString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)!'不起作用。 – sakoaskoaso

+0

转换后,什么是postString?你的意思是什么没有奏效? – AlexDrenea

+0

'(1&*%5E && 2'但是当我打印HTTP请求的结果时它仍然返回'(1' – sakoaskoaso