Ios Swift编码&;在GET参数中
我有一个简单的登录请求。用户名是银色的,密码是MOto和10 我正在使用框架来处理请求。点击登录请求时,我总是得到错误的响应。Ios Swift编码&;在GET参数中,ios,swift,urlencode,nsstringencoding,Ios,Swift,Urlencode,Nsstringencoding,我有一个简单的登录请求。用户名是银色的,密码是MOto和10 我正在使用框架来处理请求。点击登录请求时,我总是得到错误的响应。 然而,在浏览器上点击登录请求url(将实际域替换为服务器)时,我得到了正确答案: 密码中的编码和有问题。虽然我已经用百分比编码代替了它。这是我的密码: do { let passwordString = self.convertSpecialCharacters(string: password.text!) print("%
然而,在浏览器上点击登录请求url(将实际域替换为服务器)时,我得到了正确答案:
密码中的编码和有问题。虽然我已经用百分比编码代替了它。这是我的密码:
do {
let passwordString = self.convertSpecialCharacters(string: password.text!)
print("%@", passwordString)
let opt = try HTTP.GET(Constants.kLoginUrl, parameters: ["login": username.text!, "pass": passwordString])
opt.start { response in
if let err = response.error {
print("error: \(err.localizedDescription)")
return
}
print("opt finished: \(response.description)")
self.parseLoginResponse(response.data)
}
} catch _ as NSError {
}
这是转换特殊字符:
func convertSpecialCharacters(string: String) -> String {
var newString = string
let arrayEncode = ["&", "<", ">", "\"", "'", "-", "..."]
for (escaped_char) in arrayEncode {
newString = newString.encode(escaped_char)
}
return newString
}
一种合适的方法是使用
URLComponents
处理所有百分比编码:
var urlComponents = URLComponents(string: "https://server/api/check-access/by-login-pass")!
let queryItems = [URLQueryItem(name:"_key", value:"wlyOF7TM8Y3tn19KUdlq"),
URLQueryItem(name:"login", value:"silver"),
URLQueryItem(name:"pass", value:"MOto&@10")]
urlComponents.queryItems = queryItems
let url = urlComponents.url
print(url) // "https://server/api/check-access/by-login-pass?_key=wlyOF7TM8Y3tn19KUdlq&login=silver&pass=MOto%26@10"
注:我完全同意luk2302的评论。我决定完全定制我的GET请求,因为其他一切都不起作用,让我很生气。不过,我使用了不同的请求,比如从服务器获取列表。登录是通过POST请求完成的,这更容易 但是,要坚持GET请求,请执行以下操作: 我需要像“+”和“/”这样的编码字符。。。 首先,我无法使用“stringByAddingPercentEncodingWithAllowedCharacters”方法对“+”进行编码。 因此,我为String构建了自己的扩展:
extension String
{
return CFURLCreateStringByAddingPercentEscapes(
nil,
self as CFString,
nil,
"!*'();:@&=+$,/?%#[]" as CFString,
CFStringBuiltInEncodings.UTF8.rawValue
) as String
}
第二步是将其添加到我的url中,以用于最终请求。我想使用URLQueryItems,并使用url.query或url.queryItems将它们添加到url中。坏消息:我已经正确编码的字符串再次被编码,其中的每一个“%”都变成“%25”,使其无效。--
现在,我将每个编码值附加到一个字符串中,该字符串将被添加到url中。感觉不是很“快”,但还行
希望这能帮助某人并节省几个小时://请不要使用
GET
作为登录目的,在发送密码时:请参阅我阅读的最新SwiftHTTP源代码,它将百分比编码正确地添加到参数中
。因此,如果调用convertSpecialCharacters(字符串:)
,则密码是双重编码的。删除行let passwordString=self.convertSpecialCharacters(字符串:password.text!)
,并将参数创建为[“login”:username.text!,“pass”:password.text!]
(假设此处有两个!
安全)。一个小警告,URLQueryItem
未正确将+
编码为转义百分比。它将其保留为+
,这有点令人惊讶。
extension String
{
return CFURLCreateStringByAddingPercentEscapes(
nil,
self as CFString,
nil,
"!*'();:@&=+$,/?%#[]" as CFString,
CFStringBuiltInEncodings.UTF8.rawValue
) as String
}
let someUrl = "https://example.com/bla/bla.json"
var queryString = ""
var index = 0
// dicParam is of type [String: AnyObject] with all needed keys and values for the query
for (key, value) in dicParam
{
let encodedValue = (value as! String).encodeUrl()
if index != 0
{
queryString.append("&\(key)=\(encodedValue)")
}
else
{
queryString.append("?\(key)=\(encodedValue)")
}
index += 1
}
let url = URLComponents(string: someUrl + queryString)!