Nit*_*ish 2 urlencode ios nsstringencoding swift
我有一个简单的GET登录请求.用户名是Silver,密码是 MOto&@ 10
我正在使用SwiftHttp框架来处理请求.在点击登录请求时,我总是得到错误的响应.
但是,当在浏览器上点击登录请求URL(用服务器替换实际域)时,我得到了:
https:// server/api/check-access/by-login-pass?_key = wlyOF7TM8Y3tn19KUdlq&login = silver&pass = MOto%26 @ 10
编码和密码有问题.虽然我用百分比编码取而代之.这是我的代码:
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 {
}
Run Code Online (Sandbox Code Playgroud)
这是convertSpecialCharacters:
func convertSpecialCharacters(string: String) -> String {
var newString = string
let arrayEncode = ["&", "<", ">", "\"", "'", "-", "..."]
for (escaped_char) in arrayEncode {
newString = newString.encode(escaped_char)
}
return newString
}
Run Code Online (Sandbox Code Playgroud)
编码扩展:
extension String {
func encode(_ chars: String) -> String
{
let forbidden = CharacterSet(charactersIn: chars)
return self.addingPercentEncoding(withAllowedCharacters: forbidden.inverted) ?? self
}
}
Run Code Online (Sandbox Code Playgroud)
一种合适的方法是使用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"
Run Code Online (Sandbox Code Playgroud)
PS:我完全同意luk2302的评论.