如何从登录中获取JSON数据?

时间:2017-06-26 09:02:38

标签: ios json oauth swift3 alamofire

我能够使用Alamofire中的Oauth获取数据以便成功登录,但是如何在另一个viewController中获取JSON数据。

    func loginAccess(){

        let headers = [
            "Content-Type": "application/x-www-form-urlencoded"
        ]
        let parameters = [

            "UserName": username_textfield.text! as String,
            "Password": password_textfield.text! as String,
            "grant_type": "password",
                    ]


//        let url = NSURL(string: "http://192.168.100.5:84/Token")!
        Alamofire.request("http://192.168.100.5:84/Token", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody, headers: headers).responseJSON { (response:DataResponse<Any>) in

            switch(response.result) {

            case .success(_):
                if response.result.value != nil{

                    let statusCode = (response.response?.statusCode)!
                    print("...HTTP code: \(statusCode)")

                    if let JSON = response.result.value {

                        print("JSON: \(JSON)")
//                        }

                    }
                    if statusCode == 200{
                        self.view.makeToast(message: "Welcome !!")
                        self.performSegue(withIdentifier: "mainview", sender: self)

                    }else{
                    self.view.makeToast(message: "Username or password invalid")
                    }
                }

                break

            case .failure(_):

                print(response.result.error!)
                break

            }
        }
    }

模态类

class Login{

    var access_token = String()
    var token_type = String()
    var expire_in = String()
    var username = String()
    var masterid = String()
    var name = String()
    var access = String()
    var issued = String()
    var expries = String()

    init(loginJson:JSON){
    self.access_token = loginJson["access_token"].stringValue
        self.token_type = loginJson["token_type"].stringValue
        self.expire_in = loginJson["expires_in"].stringValue
        self.username = loginJson["userName"].stringValue
        self.masterid = loginJson["MasterID"].stringValue
        self.name = loginJson["Name"].stringValue
        self.access = loginJson["Access"].stringValue
        self.issued = loginJson[".issued"].stringValue
        self.expries = loginJson[".expires"].stringValue
    }


}

这能够访问另一个ViewController中的JSON数据还是需要另一个函数?如果这可能在相同的功能,那么如何 它可以解决吗?

3 个答案:

答案 0 :(得分:1)

替换为您的代码

func getlogin(){
       let headers = [
           "Content-Type": "application/x-www-form-urlencoded"
       ]
       let parameters = [

           "UserName": username_textfield.text! as String,
           "Password": password_textfield.text! as String,
           "grant_type": "password",
           ]


       //        let url = NSURL(string: "http://192.168.100.5:84/Token")!
       Alamofire.request("http://192.168.100.5:84/Token", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody, headers: headers).responseJSON { (response:DataResponse<Any>) in

           switch(response.result) {
           case.success(let data):
               print("success",data)
                let statusCode = (response.response?.statusCode)!
               if statusCode == 200{
                   self.view.makeToast(message: "Welcome !!")
//                    self.performSegue(withIdentifier: "mainview", sender: self)

               }else{
                   self.view.makeToast(message: "Username or password invalid")
               }
               self.myResponse = JSON(data)
               let login = Login(loginJson: self.myResponse)
               DispatchQueue.main.async(execute: { () -> Void in
                   self.performSegue(withIdentifier: "pass_data", sender: login)                    
                                  })

           case.failure(let error):
               print("Not Success",error)
           }

       }
   }

您也可以添加

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

       if segue.identifier == "pass_data" {

           if let eventsVC = segue.destination as? secondViewController,

               let loginData = sender as? Login {

               eventsVC.login_details = loginData

           }

       }

   }
  

在你的第二个视图控制器中,你可以像这个var一样添加变量   login_details:登录?获取JSON数据

答案 1 :(得分:0)

您可以使用关闭传递值。

创建方法

func loginAccess(callBack: (_ responseObject : [Any]) -> Void) -> Void{
       if let JSON = response.result.value {
                            callBack(JSON as Any) // here data passed
                      }
                    }
                    if statusCode == 200{
                        self.view.makeToast(message: "Welcome !!")
                        self.performSegue(withIdentifier: "mainview", sender: self)

                    }else{
                    self.view.makeToast(message: "Username or password invalid")
                            callBack([:] as Any)

                    }
        }

致电方法

self.loginAccess { (responseObject) in
            print(responseObject) // this is your data
            //create your model here

        }

答案 2 :(得分:-1)

如何从此登录名获取数据?

func onlinecheckin(){
        self.password.resignFirstResponder()
        let password1 = password.text;
       if let user1 = user.text {
                 // To trim the characters to remove the empty space
       let username = user1.trimmingCharacters(in: CharacterSet.whitespaces)
       let passwordnya = password1!.trimmingCharacters(in: CharacterSet.whitespaces)
                 //Send user data to server side
           let myUrl = URL(string: "https://link/jgcm/login.php")!
              var request = URLRequest(url: myUrl)
                 request.httpMethod = "POST"
               let postString = "user=\(username) & password=\(passwordnya)"
               
            request.httpBody = postString.data(using: String.Encoding.utf8)
           
                 task = URLSession.shared.dataTask(with: request as URLRequest) {                data, response, error in
                    
                     print("response online checking =\(String(describing: response))")
                     if error != nil {
                         task.cancel() // To cancel uploading the task.
                         self.AlertMessage("Error. Please press Login button again.");
                         print("error=\(String(describing: error))")
                         return
                     }
                   
                     if let datadownload = data {
                         resultlogin = NSString(data: datadownload, encoding: String.Encoding.utf8.rawValue)!.replacingOccurrences(of: " ", with: "");
                         print("result of online checking:\(resultlogin)")
                     }
                   
                     DispatchQueue.main.async(execute: { () -> Void in
                      if resultlogin.contains("already") {
                       
                       let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "menu")
                       self.present(secondViewController!,animated: true,completion: nil)
                       
                         } else {
                             self.AlertMessage("User atau Password Salah");
                         }
                     })
                 }
                 task.resume()
          }}