如何从 POST json 中获取数据

Posted

技术标签:

【中文标题】如何从 POST json 中获取数据【英文标题】:How to get data from the POST json 【发布时间】:2017-08-18 07:47:04 【问题描述】:

我正在创建一个登录页面,一旦用户输入用户名密码,数据就会发送到 API,如果输入的数据正确,则返回成功。如果结果成功,我需要获取服务器返回的用户的用户密钥,格式如下:


    "STATUS_DESC": "Success",
    "STATUS_CODE": 1,
    "email": "keshurai1024@gmail.com",
    "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")!)")

【讨论】:

我编辑了答案。我添加了将 api_token 存储到 UserDefaults 的代码。将此代码放入数据任务的响应闭包中。 let task = URLSession.shared.dataTask(with: request) data, response, error in //Put code here 但仍然..只有在用户名和密码正确的情况下才会执行.. 是的。您需要添加对服务器错误和响应结构的额外检查。 @Serhii Londar 你不应该在用户默认值中保存令牌。【参考方案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)

        


【讨论】:

谢谢,但我怎样才能通过做同样的事情来解决我的问题 @KeshuRai 哪个方向?仅使用 URLSession? 我可以用 Almaofire 替换 URLSession 。那不是问题..我只需要将响应(即用户的 api_token)存储到局部变量中,以便我可以进一步使用它.. 为此,您需要将其存储在UserDefaults 它没有抛出任何错误但令牌没有打印并且值没有被解析..

以上是关于如何从 POST json 中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

GET / POST方法无法使用json从mysql数据库获取数据到html

如何从 vue.js axios POST 在 Laravel 中获取 JSON?

使用来自网站 API 的 POST 请求获取 Json 数据 [重复]

如何使用 JSON 对象中的 POST 方法在 Laravel 中获取数据?

如何使用 C# 在 POST 请求中发送 json 请求正文数据

如何在android studio中通过带有密码的POST方法获取JSON数据