无法在 swift 4 中使用 Alamofire 从 JSON 响应中提取令牌
Unable to Extract token from JSON Response using Almofire in swift4
有人可以帮助我了解如何在 swift4 中使用 almofire 从我的一个 Web 服务请求中提取令牌。我想将令牌存储在其中一个变量中。下面我发布了来自我的网络服务的 JSON 响应。我还发布了我用 swift4 编写的代码。我是 Swift4 的新手,所以如果您需要其他信息来回答我的问题,请告诉我。我用粗体突出显示了代码行,并在出现错误的地方进行了注释。可能是我没有正确读取 JSON 数据。我是 JSON 数组和对象的新手。请帮助我提供代码示例。
JSON 响应:
Successfully got data {
data = {
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJiODcwY2Q4My0zZDMzLTQ1ODgtYmZlMi00MzQ0ODQ4ZmJiOGMiLCJDb250YWN0SWQiOiJiODU4NTAyYy1lZGM2LTRlY2QtYTk0ZC1kMjEwNmI3YjZlMmQiLCJuYmYiOjE1Njk4Mjk1OTAsImV4cCI6MTU2OTgzNjc5MCwiaWF0IjoxNTY5ODI5NTkwfQ.LO2Z4n0IRYaaJM6Pmp8pLeo3alDPmioaAF4ces2K-9M";
};
message = "";
status = Success; }
我可以从上面的 JSON 响应中提取状态,但我无法提取令牌 下面是我的 swift4 代码。
import UIKit
import Alamofire
import SwiftyJSON
class ViewController: UIViewController{
let URL_USER_LOGIN = "some url"
let defaultValues = UserDefaults.standard
@IBOutlet weak var labelMessage: UILabel!
@IBOutlet weak var textFieldUserName: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBAction func buttonLogin(_ sender: Any) {
let parameters: Parameters=[
"username":textFieldUserName.text!,
"password":textFieldPassword.text!
]
Alamofire.request(URL_USER_LOGIN, method: .post,parameters: parameters,encoding: JSONEncoding.default, headers: headers).responseJSON
{
response in
let jsonData = response.result.value as? NSDictionary
let status = jsonData? ["status"] as! String
// when I use **tokendata = jsonData? ["token"] as! String** I am getting Error Please help me with code fixes
if status == "Success" {
let profileViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewcontroller") as! ProfileViewController
self.navigationController?.pushViewController(profileViewController, animated: true)
self.dismiss(animated: false, completion: nil)
}else{
//error message in case of invalid credential
let alert = UIAlertController(title: "Alert", message: "Email or Passowrd is Not matching", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style:.default, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
//self.labelMessage.text = "Invalid username or password"
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
let backButton = UIBarButtonItem(title: " ", style: UIBarButtonItem.Style.plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
if defaultValues.string(forKey: "username") != nil{
let profileViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewcontroller") as! ProfileViewController
self.navigationController?.pushViewController(profileViewController, animated: true)
}
}
override func viewWillAppear(_ animated: Bool) {
navigationController?.isNavigationBarHidden = true
}
首先,您必须修改您的 JSON
回复。因为格式不好。您的 JSON
应该如下所示。
{
"status" : "Success",
"message" : "your message",
"data":{"token" : "your_token"}
}
您正在使用 SwiftyJSON
。所以你可以用 SwiftyJSON
解析你的值,如下所示
let json = try JSON(data: response.data)
let status = json["status"].stringValue
let message = json["message"].stringValue
let data = json["data"].dictionaryValue
let token = data["token"]?.stringValue
有人可以帮助我了解如何在 swift4 中使用 almofire 从我的一个 Web 服务请求中提取令牌。我想将令牌存储在其中一个变量中。下面我发布了来自我的网络服务的 JSON 响应。我还发布了我用 swift4 编写的代码。我是 Swift4 的新手,所以如果您需要其他信息来回答我的问题,请告诉我。我用粗体突出显示了代码行,并在出现错误的地方进行了注释。可能是我没有正确读取 JSON 数据。我是 JSON 数组和对象的新手。请帮助我提供代码示例。
JSON 响应:
Successfully got data { data = { token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJiODcwY2Q4My0zZDMzLTQ1ODgtYmZlMi00MzQ0ODQ4ZmJiOGMiLCJDb250YWN0SWQiOiJiODU4NTAyYy1lZGM2LTRlY2QtYTk0ZC1kMjEwNmI3YjZlMmQiLCJuYmYiOjE1Njk4Mjk1OTAsImV4cCI6MTU2OTgzNjc5MCwiaWF0IjoxNTY5ODI5NTkwfQ.LO2Z4n0IRYaaJM6Pmp8pLeo3alDPmioaAF4ces2K-9M"; }; message = ""; status = Success; }
我可以从上面的 JSON 响应中提取状态,但我无法提取令牌 下面是我的 swift4 代码。
import UIKit
import Alamofire
import SwiftyJSON
class ViewController: UIViewController{
let URL_USER_LOGIN = "some url"
let defaultValues = UserDefaults.standard
@IBOutlet weak var labelMessage: UILabel!
@IBOutlet weak var textFieldUserName: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBAction func buttonLogin(_ sender: Any) {
let parameters: Parameters=[
"username":textFieldUserName.text!,
"password":textFieldPassword.text!
]
Alamofire.request(URL_USER_LOGIN, method: .post,parameters: parameters,encoding: JSONEncoding.default, headers: headers).responseJSON
{
response in
let jsonData = response.result.value as? NSDictionary
let status = jsonData? ["status"] as! String
// when I use **tokendata = jsonData? ["token"] as! String** I am getting Error Please help me with code fixes
if status == "Success" {
let profileViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewcontroller") as! ProfileViewController
self.navigationController?.pushViewController(profileViewController, animated: true)
self.dismiss(animated: false, completion: nil)
}else{
//error message in case of invalid credential
let alert = UIAlertController(title: "Alert", message: "Email or Passowrd is Not matching", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style:.default, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
//self.labelMessage.text = "Invalid username or password"
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
let backButton = UIBarButtonItem(title: " ", style: UIBarButtonItem.Style.plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
if defaultValues.string(forKey: "username") != nil{
let profileViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewcontroller") as! ProfileViewController
self.navigationController?.pushViewController(profileViewController, animated: true)
}
}
override func viewWillAppear(_ animated: Bool) {
navigationController?.isNavigationBarHidden = true
}
首先,您必须修改您的 JSON
回复。因为格式不好。您的 JSON
应该如下所示。
{
"status" : "Success",
"message" : "your message",
"data":{"token" : "your_token"}
}
您正在使用 SwiftyJSON
。所以你可以用 SwiftyJSON
解析你的值,如下所示
let json = try JSON(data: response.data)
let status = json["status"].stringValue
let message = json["message"].stringValue
let data = json["data"].dictionaryValue
let token = data["token"]?.stringValue