Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift编码&;在GET参数中_Ios_Swift_Urlencode_Nsstringencoding - Fatal编程技术网

Ios Swift编码&;在GET参数中

Ios Swift编码&;在GET参数中,ios,swift,urlencode,nsstringencoding,Ios,Swift,Urlencode,Nsstringencoding,我有一个简单的登录请求。用户名是银色的,密码是MOto和10 我正在使用框架来处理请求。点击登录请求时,我总是得到错误的响应。 然而,在浏览器上点击登录请求url(将实际域替换为服务器)时,我得到了正确答案: 密码中的编码和有问题。虽然我已经用百分比编码代替了它。这是我的密码: do { let passwordString = self.convertSpecialCharacters(string: password.text!) print("%

我有一个简单的登录请求。用户名是银色的,密码是MOto和10 我正在使用框架来处理请求。点击登录请求时,我总是得到错误的响应。
然而,在浏览器上点击登录请求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)!