2017-08-18 9 views
1

ログインページを作成しています。このページでは、ユーザーがusernameパスワードを入力してからデータが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") 
    } 
} 

そして、あなたはUserDefaultsを使用する必要があなたのapi_tokenを保存するために:

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

コードでこれを渡す場所を教えてください –

+0

答えを編集しました。 UserDefaultsにapi_tokenを格納するコードを追加しました。このコードをデータタスクの応答終了にします。 –

+0

let task = URLSession.shared.dataTask(with:request){データのレスポンス、{//ここにコードを入れてください} –

-2

をおURLSessionを使用している理由を私は理解していませんでした。 URLSessionのラッパーであるAlamofireを使用できます。

@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 –

+0

@KeshuRaiどちらの方法? URLSessionのみを使用していますか? –

+0

私の問題は:ログイン後に戻ってくるapi_tokenを取得するにはどうすればいいですか? –

関連する問題