2017-08-18 269 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 .. –