Swift编码和GET参数

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)

vad*_*ian 6

一种合适的方法是使用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的评论.

  • 一个小警告,`URLQueryItem`没有编码`+`到百分比正确转义.它将它留作"+",这有点令人惊讶. (3认同)