Json I';我的登录验证有问题
我有一个JSON Post身份验证来发出登录请求,当然我需要发送user&password参数来接收填充我的HomeViewController的响应,所以我需要首先验证这两个参数,如果用户不存在,当然我会发送警报并禁止访问家庭。问题是,我不知道该用哪种方法进行验证,因为我这样做的方式会在验证之前给我一个警告。这是我的代码:Json I';我的登录验证有问题,json,swift,alert,Json,Swift,Alert,我有一个JSON Post身份验证来发出登录请求,当然我需要发送user&password参数来接收填充我的HomeViewController的响应,所以我需要首先验证这两个参数,如果用户不存在,当然我会发送警报并禁止访问家庭。问题是,我不知道该用哪种方法进行验证,因为我这样做的方式会在验证之前给我一个警告。这是我的代码: class LoginViewController: UIViewController, LoginProtocol { @IBOutlet weak var u
class LoginViewController: UIViewController, LoginProtocol {
@IBOutlet weak var username: UITextField!
@IBOutlet weak var password: UITextField!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
var user : String = ""
var psw : String = ""
var idResponse : String = ""
var message : String = ""
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func validateLogin(_ sender: Any) {
DoLogin(self.username.text!, self.password.text!)
}
@IBAction func login(_ sender: Any) {
if self.idResponse != "0" {
validation(message: self.message)
} else {
let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController
self.present(vc, animated: false, completion: nil)
vc.getUser = self.username.text!
vc.getPassword = self.password.text!
}
}
func validation(message: String) {
let myAlert = UIAlertController(title: "Alert", message: message, preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction (title: "Ok", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction)
self.present(myAlert, animated: true, completion: nil)
return
}
func DoLogin(_ user:String, _ psw:String)
{
let url = URL(string: "http://162.209.99.39:8080/MiClaroBackend/auth")
let session = URLSession.shared
let request = NSMutableURLRequest(url: url!)
request.httpMethod = "POST"
self.username.text = user
self.password.text = psw
let paramToSend = ["username":user,"password":psw]
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try! JSONSerialization.data(withJSONObject: paramToSend)
let task = session.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
guard let _:Data = data else
{
return
}
let json:AnyObject?
do {
json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json{
let loginModel = LoginModel()
let defaultServiceResponse = parseJSON["defaultServiceResponse"] as! NSDictionary
loginModel.message = defaultServiceResponse["message"] as! String
loginModel.idResponse = defaultServiceResponse["idResponse"] as! Int
self.idResponse = String(loginModel.idResponse)
self.message = loginModel.message
print(json!)
}
} catch {
let error = ErrorModel()
error.phrase = "PARSER_ERROR"
error.code = -1
error.desc = "Parser error in login action"
}
})
task.resume()
}
validateLogin方法附加到一个TextView,操作为:“EditingDidEnd”。因此,我需要的是,当我写完密码后,DoLogin函数会验证存在的密码,并让我继续访问HomeViewController,但问题是,当我单击“Ingrear”(登录)按钮时,它会首先显示一个空白警报,只有在我第二次单击按钮时,它才让我立即通过。如果我以前没有调用,我不知道为什么要发送我在“func验证”中声明的警报。我将附上一张图片,向您显示出现的警报:
当您按下登录按钮时,EditingDidEnd方法很可能会调用后台处理的DoLogin。因此,当idResponse初始化为“”空字符串时,下面的if条件变为true 如果self.idResponse!=“0” 纠正此if条件以检查其是否为空,然后不要调用验证消息
最好的方法是只在点击登录按钮后调用DoLogin,如果成功,则重定向到主页。否则显示警报。请注意,在主线程上执行UI操作。首先按如下方式更新代码和用户
func DoLogin(_ user:String, _ psw:String)
{
let url = URL(string: "http://162.209.99.39:8080/MiClaroBackend/auth")
let session = URLSession.shared
let request = NSMutableURLRequest(url: url!)
request.httpMethod = "POST"
let paramToSend = ["username":user,"password":psw]
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try! JSONSerialization.data(withJSONObject: paramToSend)
let task = session.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
guard let _:Data = data else
{
return
}
let json:AnyObject?
do {
json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json{
let loginModel = LoginModel()
let defaultServiceResponse = parseJSON["defaultServiceResponse"] as! NSDictionary
loginModel.message = defaultServiceResponse["message"] as! String
loginModel.idResponse = defaultServiceResponse["idResponse"] as! Int
self.idResponse = String(loginModel.idResponse)
self.message = loginModel.message
if self.idResponse != "0" {
validation(message: self.message)
} else {
let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController
self.present(vc, animated: false, completion: nil)
vc.getUser = user!
vc.getPassword = psw!
}
}
} catch {
let error = ErrorModel()
error.phrase = "PARSER_ERROR"
error.code = -1
error.desc = "Parser error in login action"
}
})
task.resume()
}
如果要在imageview中添加警报,请使用以下代码
var imageView = UIImageView(frame: CGRectMake(220, 10, 40, 40))
imageView.image = yourImage
alert.view.addSubview(imageView)
您是否知道
dataTask(with
异步工作?当您想要验证时?验证后您想要调用login?与您想要知道的内容无关,仅供参考:此行DoLogin(self.username.text!,self.password.text!)
如果用户未输入密码或用户名,则会崩溃。因此,最好安全地打开包装。请参阅,您必须实现完成处理程序才能获得通知。这里有数百个相关问题。简短示例:抱歉,但这不起作用,因为要在包装上写入用户和密码,首先需要进行验证TextView,所以我不能将条件放在JSON序列化中。你能帮我展示一下if条件必须是什么吗?因为我这样写,什么都没有发生:if self.idResponse.isEmpty==true{}else if self.idResponse!=“0”{验证(消息:self.message)}else{let vc=self.storyboard!。实例化eviewcontroller(标识符为:“home”)为!HomeViewController self.present(vc,动画:false,完成:nil)vc.getUser=self.username.text!vc.getPassword=self.password.text!}根据Vadian的回答,一旦在完成处理程序中添加此警报代码显示,您将不会面临响应为空的问题,因此您将不会看到空警报。在完成处理程序中,您可以拥有有效的响应条件和无效的响应条件,并相应地执行操作。成功和错误情况将取决于验证服务将返回的响应。