2017-08-18 202 views
1

我正在创建一个登录页面,一旦用户输入用户名密码,然后将数据发送到API,并且如果输入的数据正确,则返回成功。如果结果是成功的,我需要得到它是由serverin返回此表的用户的用户密钥:如何从POST中获取数据json

{ 
    "STATUS_DESC": "Success", 
    "STATUS_CODE": 1, 
    "email": "[email protected]", 
    "api_token": "Mqbraok1zsdasdasd4j3m" 
} 

现在我需要存储这个API令牌。 对于这个我想这个功能,但它不工作 -

@IBAction func signInBtnPressed(_ sender: Any) { 

    let email : String! = self.usernameField.text 
    let password : String! = self.passwordField.text 

    var request = URLRequest(url: URL(string: "\(URL_BASE)\(AUTH)\(LOGIN)")!) 
    request.httpMethod = "POST" 
    let postString = "email=\(email!)&&password=\(password!)" 
    request.httpBody = postString.data(using: .utf8) 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     guard let data = data, error == nil else {             // check for fundamental networking error 
      print("error=\(String(describing: error))") 
      print("cant run") 
      return 
     } 

     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(String(describing: response))") 
      print("\(email)") 
      print("\(password)") 


     } 
     else { 
     let responseString = String(data: data, encoding: .utf8) 
     print("responseString = \(String(describing: responseString))") 
      print("\(URL_BASE)\(AUTH)\(LOGIN)/?\(postString)") 
      Alamofire.request("\(URL_BASE)\(AUTH)\(LOGIN)/?\(postString)" , method : .post).responseJSON { response in 
     let result = response.result 
     if let dict = result.value as? Dictionary<String,AnyObject> 
     { 
      print(dict) 
     let userTOKEN = dict["api_token"] as! String 
      print(userTOKEN) 
      } 

      } 
     } 
    } 
    task.resume() 
} 

请告诉我什么错在做,以及如何我可以纠正它..

回答

1

试试这个解析数据,以JSON:

if let jsonData = data { 
     do { 
      let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as? [String : Any] 
      print(jsonResult) 
      print(jsonResult?["api_token"]) 

      //Here we saving aoi_token to UserDefaults: 
      UserDefaults.standard.setValue(token, forKey: "api_token") 
      print("\(UserDefaults.standard.value(forKey: "api_token")!)") 
    } catch { 
      print("JSON Processing Failed") 
    } 
} 

,并存储你的api_token你需要使用UserDefaults:

UserDefaults.standard.setValue(token, forKey: "api_token") 
print("\(UserDefaults.standard.value(forKey: "api_token")!)") 
+0

你能告诉我在哪里通过代码 –

+0

我编辑了答案。我添加了代码将api_token存储到UserDefaults。将此代码放入您的数据任务的响应闭包中。 –

+0

let task = URLSession.shared.dataTask(with:request){data,response,error {{//把代码放在这里} –

-2

我不明白为什么要使用URLSession。你可以使用Alamofire这是一个围绕URLSession的包装。

@IBAction func signInBtnPressed(_ sender: Any) { 
    let email : String = self.usernameField.text ?? "" 
    let password : String = self.passwordField.text ?? "" 

    Alamofire.request("\(URL_BASE)\(AUTH)\(LOGIN)/", 
         method: .post, 
         parameters: ["email": email, 
            "password", password], 
         encoding: URLEncoding.httpBody).responseJSON { response in 

         if let dict = response.value as? [String: Any] { 
          let token = dict["api_token"] as! String 

          //store token 
          UserDefaults.standard.set(token, forKey: "token") 
          UserDefaults.standard.synchronize() 
         } 


         let savedToken = UserDefaults.standard.string(forKey: "token")  
         print(savedToken) 

     } 

} 
+0

感谢,但我怎么能这样做的解决我的问题wa wa –

+0

@KeshuRai哪条路?只使用'URLSession'? –

+0

我的问题是:如何获取登录后返回的api_token .. –