Swift:尝试对用户进行编码并传入 UTF8
Swift: Trying to encode user and pass into UTF8
我使用的 API 不需要 headers 来验证登录屏幕中的用户凭据。我想对电子邮件进行编码并传递到 UTF8,以防电子邮件或通行证中有诸如“+”之类的字符。这是我的代码:
func logIn() {
var email = emailTextField.text
var pass = passwordTextField.text
var encodedEmail = email.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
var encodedPass = pass.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
var url = "https://www.photoshelter.com/psapi/v3/mem/authenticate?api_key=\(api_key)&email=\(encodedEmail!)&password=\(encodedPass!)&mode=token"
var baseURL:NSURL? = NSURL(string: url)
var request: NSMutableURLRequest? = NSMutableURLRequest(URL: baseURL!)
var session = NSURLSession.sharedSession()
var task = session.dataTaskWithRequest(request!, completionHandler: { (data, response, error) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if response == nil {
UIAlertView(title: "PhotoShelter", message: "No internet connection", delegate: nil, cancelButtonTitle: "Cancel").show()
} else {
var responseObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)
var status: AnyObject? = responseObject?.objectForKey("status")
if status as String != "ok" {
UIAlertView(title: "PhotoShelter", message: "Invalid Credentials", delegate: nil, cancelButtonTitle: "OK").show()
} else {
var tokenString: AnyObject? = responseObject?.objectForKey("data")
var token: AnyObject? = tokenString?.objectForKey("token")
println(token!)
}
}
})
})
task.resume()
}
它运行良好,我打印的令牌在正常登录时没有问题。当我添加带有“+”的电子邮件时,baseURL 不会读取它。它将“@”符号转换为 %40 但忽略“+”。
我还要注意,当我使用:
var encodedEmail = email.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
var encodedPass = pass.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
也没用。有想法该怎么解决这个吗?
代码正在执行您的要求。你只是没有问正确的事情。您要求它获取一个字符串并将给定 NSCharacterSet 中的所有字符 not 转换为百分比编码。 (顺便说一句,您不是在尝试将用户名和密码编码为 UTF-8,您是在尝试对它们进行百分比编码,或者 URL 编码。)
您传递的字符集包括 +,因为,+ 在 URLs 中是允许的。
要得到你想要的结果,你需要给一个不包含+的字符集。我不知道有什么好的、面向 URL 的预定义集可以做到这一点,因此您必须自己制作。这是一种解决方法:
import Foundation
let x: NSString = "some+other@host.xxx"
let modifiedHostCharacterSet: NSMutableCharacterSet = NSCharacterSet.URLHostAllowedCharacterSet().mutableCopy() as NSMutableCharacterSet
modifiedHostCharacterSet.removeCharactersInString("+")
x.stringByAddingPercentEncodingWithAllowedCharacters(modifiedHostCharacterSet)
该片段旨在展示您在 Xcode 游乐场或 REPL 中期望的结果。
我使用的 API 不需要 headers 来验证登录屏幕中的用户凭据。我想对电子邮件进行编码并传递到 UTF8,以防电子邮件或通行证中有诸如“+”之类的字符。这是我的代码:
func logIn() {
var email = emailTextField.text
var pass = passwordTextField.text
var encodedEmail = email.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
var encodedPass = pass.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
var url = "https://www.photoshelter.com/psapi/v3/mem/authenticate?api_key=\(api_key)&email=\(encodedEmail!)&password=\(encodedPass!)&mode=token"
var baseURL:NSURL? = NSURL(string: url)
var request: NSMutableURLRequest? = NSMutableURLRequest(URL: baseURL!)
var session = NSURLSession.sharedSession()
var task = session.dataTaskWithRequest(request!, completionHandler: { (data, response, error) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if response == nil {
UIAlertView(title: "PhotoShelter", message: "No internet connection", delegate: nil, cancelButtonTitle: "Cancel").show()
} else {
var responseObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)
var status: AnyObject? = responseObject?.objectForKey("status")
if status as String != "ok" {
UIAlertView(title: "PhotoShelter", message: "Invalid Credentials", delegate: nil, cancelButtonTitle: "OK").show()
} else {
var tokenString: AnyObject? = responseObject?.objectForKey("data")
var token: AnyObject? = tokenString?.objectForKey("token")
println(token!)
}
}
})
})
task.resume()
}
它运行良好,我打印的令牌在正常登录时没有问题。当我添加带有“+”的电子邮件时,baseURL 不会读取它。它将“@”符号转换为 %40 但忽略“+”。
我还要注意,当我使用:
var encodedEmail = email.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
var encodedPass = pass.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
也没用。有想法该怎么解决这个吗?
代码正在执行您的要求。你只是没有问正确的事情。您要求它获取一个字符串并将给定 NSCharacterSet 中的所有字符 not 转换为百分比编码。 (顺便说一句,您不是在尝试将用户名和密码编码为 UTF-8,您是在尝试对它们进行百分比编码,或者 URL 编码。)
您传递的字符集包括 +,因为,+ 在 URLs 中是允许的。
要得到你想要的结果,你需要给一个不包含+的字符集。我不知道有什么好的、面向 URL 的预定义集可以做到这一点,因此您必须自己制作。这是一种解决方法:
import Foundation
let x: NSString = "some+other@host.xxx"
let modifiedHostCharacterSet: NSMutableCharacterSet = NSCharacterSet.URLHostAllowedCharacterSet().mutableCopy() as NSMutableCharacterSet
modifiedHostCharacterSet.removeCharactersInString("+")
x.stringByAddingPercentEncodingWithAllowedCharacters(modifiedHostCharacterSet)
该片段旨在展示您在 Xcode 游乐场或 REPL 中期望的结果。