我正在使用NSURLComponents,并正在设置用户名和密码:
let urlComponents = NSURLComponents(string: webservice);
urlComponents?.user = username;
urlComponents?.password = password;
字符串
我使用的密码中有一个特殊字符(正斜杠/)
我已经确认输入的密码是正确的,我正在尝试的所有其他密码都是正确的,除了带有this /的密码。
我必须摆脱特殊角色吗?
以下是完整的方法:
func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
{
let urlComponents = NSURLComponents(string: webservice);
urlComponents?.user = username;
urlComponents?.password = password
let url = urlComponents?.url;
URLSession.shared.dataTask(with: url!, completionHandler: {
(data, response, error) in
if(error != nil){
completion(false)
}else{
do{
let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject]
OperationQueue.main.addOperation({
self.appDelegate.communityArray = json
//Get Community Descrtiptions and add them to appDelegates communityDescriptionArray
self.getCommunities() { (result: Dictionary<String, Dictionary<String, Any>>) in
self.appDelegate.communityList = result
completion(true)
}
})
}catch let error as NSError{
print(error)
completion(false)
}
}
}).resume()
}
型
我尝试时得到错误
let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject]
型
我得到的错误:
错误域=NSCocoaErrorDomain代码=3840“字符0附近的值无效。”UserInfo={NSDebugDescription=字符0附近的值无效。}
2条答案
按热度按时间93ze6v8z1#
永远不要将密码作为URL的一部分传递。URL以明文形式发送到上游DNS服务器。
而且你的目的也不明确“@”符号和“/”字符在URL中不是法律的字符。“/”是法律的的,但它是一个路径分隔符。
hkmswyz62#
正斜杠字符必须在authority组件中百分比编码为“%2F”(用户和密码是authority的userinfo子组件中的字段),因为它是URI/URL字符串中的保留字符,一个通用分隔符。如果正斜杠不是百分比编码的,那么它将标记权限组件的结尾,并成为路径组件的第一个字符。
此外(正如Michael Shulman的回答所指出的),RFC 3986表示在URL的userinfo子组件中使用格式“user:password”是不推荐的--这是因为以明文形式传递身份验证信息已被证明是一个安全风险。