【问题标题】:swift 3 REST api - get call returns 1 byte instead of 1 (as an int), why?swift 3 REST api - get 调用返回 1 个字节而不是 1(作为 int),为什么?
【发布时间】:2017-05-01 10:59:15
【问题描述】:

所以我试图从我的数据库中获取一个数字。当我使用邮递员时,我的 get 调用返回 1。但是,当我在下面运行此代码时,我得到 1 个字节。

func getDbVersionFromServer(callback: @escaping (_ serverDbVersion: Int16)-> ()) {
    let urlPath = "\(baseApiUrl)/users/getDBVersion"
    let url = NSURL(string: urlPath)
    let session = URLSession.shared
    let request = NSMutableURLRequest(url: url as! URL)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    getTokensFromDB(){dbTokens in
    request.addValue(dbTokens["accessToken"]!, forHTTPHeaderField: "accessToken")
    request.addValue(dbTokens["refreshToken"]!, forHTTPHeaderField: "refreshToken")
    request.httpMethod = "GET"

            let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in

                if let httpResponse = response as? HTTPURLResponse {
                    if (httpResponse.statusCode == 200){
                        let aToken = httpResponse.allHeaderFields["accessToken"] as? String
                        updateAccessTokenOnly(newAccessToken: aToken!)

                        let dbVersion = data
                        print("here is data: \(data!) and here is dbVersion \(dbVersion!)")
                        callback(0)
                    }
                }
            })
            task.resume()
    }
}

我在这里做错了什么?我如何得到我的 1?提前致谢!

【问题讨论】:

  • 澄清一下,我的 get 调用应该返回 Int 1 但它返回:“这里是数据:1 字节,这里是 dbVersion 1 字节”

标签: rest api swift3 get


【解决方案1】:

数据是Data 的类型,因此如果您的响应没有返回JSON,您可以使用String(data:encoding:) 来获得预期结果。

let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in

    if let httpResponse = response as? HTTPURLResponse {
        if (httpResponse.statusCode == 200){
            let aToken = httpResponse.allHeaderFields["accessToken"] as? String
            updateAccessTokenOnly(newAccessToken: aToken!)

            if let data = data, let stringResponse = String(data: data, encoding: .utf8) {
                print("Response \(stringResponse)")
            }
            callback(0)
        }
    }
})
task.resume()

【讨论】:

  • 虽然将其转换为字符串,对吗?如果我想要作为 Int16,我可以: if let data = data, let stringResponse = Int16(data: data, encoding: .utf8) { print("Response (stringResponse)") }
  • 哦,它实际上应该是它返回的json
  • @SteffenLefort 您需要先确认它正在返回 JSON 或只是 1 也没有像 Int16(data: data, encoding: .utf8) 这样的东西,但您可以将此字符串转换为 Int16,尝试一次解决方案,您将得到您的结果
  • 是的,那行得通,之后我只是转换为 Int16。非常感谢!
  • @SteffenLefort 你应该使用 JSONSerialization.jsonObject(with: data 来序列化你的 json 数据
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2011-06-07
  • 2011-09-07
相关资源
最近更新 更多