【问题标题】:send token to server Swift 3将令牌发送到服务器 Swift 3
【发布时间】:2017-11-08 13:39:30
【问题描述】:

我正在尝试向我的服务器发送令牌以检查令牌是否仍然有效或已过期。令牌值是从设备上保存的数据中提取的。但无论我尝试什么,它都会一直给我“丢失的令牌”,这是我发送空字符串时的状态消息。

    // load content in user var
    user = UserDefaults.standard.value(forKey: "parseJSON") as? NSDictionary

    // if user is once logged in / register, keep him logged in
    if user != nil {
        print(user as Any)

        let userToken = user!["token"] as? String

        let url = NSURL(string: "http://fmm.dummy.com/api/v1/auth/me")!

        var request = URLRequest(url: url as URL)

        request.setValue("Bearer \(String(describing: userToken))", forHTTPHeaderField: "Authorization")

        request.httpMethod = "POST"

当我编辑并执行此操作时,错误消息更改为“无效令牌”,这意味着我正在发送一些东西。只是不正​​确

    // load content in user var
    user = UserDefaults.standard.value(forKey: "parseJSON") as? NSDictionary

    // if user is once logged in / register, keep him logged in
    if user != nil {
        print(user as Any)

        let userToken = user!["token"] as? String

        let a: Character = "<"
        let b: Character = ">"
        let url = NSURL(string: "http://fmm.dummy.com/api/v1/auth/me")!

        var request = URLRequest(url: url as URL)

        request.setValue("Bearer .append\(a)\(String(describing: userToken)).append\(b)", forHTTPHeaderField: "Authorization")

        request.httpMethod = "POST"


        //launch session
        URLSession.shared.dataTask(with: request) { data, response, error in

有人可以帮我弄清楚做错了什么吗? 谢谢

///编辑 嗨,当我按照您的建议进行编辑并想出这个时,我什至无法打印到控制台。这是供您考虑的完整代码。感谢您的回复。 如果让 user = UserDefaults.standard.object(forKey: "parseJSON") as? [字符串:任何], 让 userToken = user["token"] as?字符串 {

       let url = URL(string: "http://fmm.dummy.com/api/v1/auth/me")!
       var request = URLRequest(url: url)

       let tokenString = "Bearer " + userToken
       request.setValue(tokenString, forHTTPHeaderField: "Authorization")
       request.httpMethod = "POST"

       //launch session
       URLSession.shared.dataTask(with: request) { data, response, error in

           //check if no error
           if error == nil{

               do {

                   let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

                   guard let parseJSON = json else{

                       print ("Error While Parsing")
                       return
                   }
                   print(parseJSON)

                   let statusMsg = parseJSON["status"] as? String

                   if  statusMsg == "OK"{
                       //token still valid
                       self.login()

                   }else {
                       //token is invalid
                       // get main queue to communicate back to user
                       DispatchQueue.main.async(execute: {
                           let message = parseJSON["status_msg"] as! String
                           appDelegate.infoView(message: message, color: colorSmoothRed)
                       })
                   }



               }catch{
                   // get main queue to communicate back to user
                   DispatchQueue.main.async(execute: {
                       let message = "\(error)"
                       appDelegate.infoView(message: message, color: colorSmoothRed)
                   })
                   return

               }


           }else{

               // get main queue to communicate back to user
               DispatchQueue.main.async(execute: {
                   let message = error!.localizedDescription
                   appDelegate.infoView(message: message, color: colorSmoothRed)
               })
               return
           }
           }.resume()



   }

我正在尝试在 appdelegate.swift 中编写代码来检查从先前登录保存的令牌是否仍然有效或已过期!用户设备上保存的对象如下。当我将用户打印到控制台时,我得到了这个。 ::--

可选({ 响应 = { 令牌= “eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjIsImlzcyI6Imh0dHA6XC9cL3htbS54bW9iaWxlbW9uZXkuY29tXC9hcGlcL3YxXC9hdXRoIiwiaWF0IjoxNDk2ODUyNTkxLCJleHAiOjE0OTY4NTYxOTEsIm5iZiI6MTQ5Njg1MjU5MSwianRpIjoiOTFhYjE0MjZkMGZmN2RjZDVjOTQzNTlkZGY4OGY0ZmYifQ.WaQFprfRbJMDQ72IORtWrcSmUqY3EaJp5BAqjijvUAc”; 已验证 = 1; }; 状态=确定; })

【问题讨论】:

    标签: ios iphone json swift


    【解决方案1】:

    在调用 description 方法时,您使用了太多的可选项,这可能会导致意外的文字 "Optional(&lt;value&gt;)"

    使用可选绑定安全地解开所有选项:

    if let user = UserDefaults.standard.object(forKey: "parseJSON") as? [String:Any],
        let userToken = user["token"] as? String {
    
        let url = URL(string: "http://fmm.dummy.com/api/v1/auth/me")!
        var request = URLRequest(url: url)
    
        let tokenString = "Bearer " + userToken
        request.setValue(tokenString, forHTTPHeaderField: "Authorization")
        request.httpMethod = "POST"
        ...
    

    一如既往,从不使用valueForKeyUserDefaults获取单个对象,始终使用objectForKey从不使用NSDictionary作为属性列表兼容字典,始终使用[String:Any]

    【讨论】:

    • 感谢您的及时答复,请检查我的编辑。非常感谢
    • 什么是连续问题?请。我写了永远不要将 NSDictionary 用于符合属性列表的字典。 JSON 对象符合属性列表
    • 上面的代码完全没有做任何事情,甚至没有显示错误。对不起,如果我很天真而且完全没用,但我是一个 3 周大的 swifty!我相信没有正确地从保存的对象中检索令牌。
    • 没有错误显示,因为代码正确接收了数据。在statusMsg == "OK" 范围内,您必须编写if let response = parseJSON["response"] as? [String:Any], let verified = response["verified"] as? Bool, verified == true { print(response["token"] as! String) }。如果已验证,则会打印令牌。 `
    猜你喜欢
    • 2011-11-20
    • 2020-12-14
    • 2016-12-03
    • 1970-01-01
    • 2016-05-23
    • 2015-02-10
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多