Swift 5 API 调用数据变量 nil 但 API 证明有效

Posted

技术标签:

【中文标题】Swift 5 API 调用数据变量 nil 但 API 证明有效【英文标题】:Swift 5 API call data variable nil but API proved working 【发布时间】:2021-02-19 15:26:54 【问题描述】:

我在尝试让我的 ios 应用与我的 express 后端通信时遇到了一些麻烦。

我刚开始使用 swift 和 iOS 开发,但我认为这应该可行:

func fetchLoc() 
    var currentLoc: CLLocation!
    
    currentLoc = locationManager.location
    
    let latitude = String(currentLoc.coordinate.latitude)
    let longitude = String(currentLoc.coordinate.longitude)
    
    //let url = URL(string: "a542cd3116ed.ngrok.io/api/v1/public/location/66.68994/10.249066/50")!
    let url = URL(string: "http://a542cd3116ed.ngrok.io/api/v1/public/" + "location/" + latitude + "/" + longitude + "/100")!

    var request = URLRequest(url: url)
    request.httpMethod = "GET"

    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler:  data, response, error -> Void in
        do 
            if((data) != nil) 
                let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
                print(json)
            
         catch 
            print("error")
        
    )

    task.resume()

问题是,Data 总是为零。如您所见,我已经尝试插入完整的 URL 进行测试。但这没有任何区别。我的代码一定有问题,因为我可以很好地从 Insomnia 调用 API。答案看起来像这样,所以它是正确的 JSON:

[
  
    "location": 
      "type": "Point",
      "coordinates": [
        66.68994,
        10.249066
      ]
    ,
    "type": "shop",
    "name": "Laden weg 60",
    "description": null,
    "status": "active",
    "taxRates": [
      0.19,
      0.07
    ],
    "currency": "EUR",
    "_id": "602e390b7c760032c0cc74d7",
    "address": 
      "street": "abc1",
      "number": null,
      "city": null,
      "zip": null,
      "country": "DE",
      "_id": "602e390b7c760032c0cc74d8"
    ,
    "__v": 0
  
]

我希望我只是在这里监督一些明显的事情。提前谢谢!

邮递员生成了这段代码:

import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

var semaphore = DispatchSemaphore (value: 0)

var request = URLRequest(url: URL(string: "http://a542cd3116ed.ngrok.io/api/v1/public/location/66.68994/10.249066/50")!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"

let task = URLSession.shared.dataTask(with: request)  data, response, error in 
  guard let data = data else 
    print(String(describing: error))
    semaphore.signal()
    return
  
  print(String(data: data, encoding: .utf8)!)
  semaphore.signal()


task.resume()
semaphore.wait()

【问题讨论】:

它只是不进入 if 因为数据总是 nil。 print("error") => print("Error while deserializing: \(error)"),以后可能会有所帮助。但是,首先在顶部打印error,以防data 为零。不相关,但 ` if((data) != nil) ` 应该是 if let data = data ,软展开。 感谢您的提示,但到目前为止还没有运气。我在调试器中查看了数据,反正肯定是 nil。 你可以让它与 POSTMAN 一起工作吗?我知道 POSTMAN 可以生成 Swift 代码(不是 Swifty 代码,但仍然可以工作),看看它是否可以工作。它可能有助于发现差异和错误。 blog.postman.com/… 对 Insomnia 没问题,但让我试试 Postman。立即安装。 【参考方案1】:

Postman 生成的解决方案对我有用:

import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

var semaphore = DispatchSemaphore (value: 0)

var request = URLRequest(url: URL(string: "http://a542cd3116ed.ngrok.io/api/v1/public/location/66.68994/10.249066/50")!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"

let task = URLSession.shared.dataTask(with: request)  data, response, error in 
  guard let data = data else 
    print(String(describing: error))
    semaphore.signal()
    return
  
  print(String(data: data, encoding: .utf8)!)
  semaphore.signal()


task.resume()
semaphore.wait()

【讨论】:

这是一个硬编码的 URL,你有没有用 lat 和 lng 变量验证 URL? 这不是 Swifty 代码,它很糟糕。现在的问题是,在您的情况下,url.absoluteSring 是什么不起作用?对吗? 不知道您对 url.absoluteString 的确切含义,但我尝试了硬编码的 URL 和生成的 URL。

以上是关于Swift 5 API 调用数据变量 nil 但 API 证明有效的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试重新加载日期时,Swift 5 TableView 在 ViewController 中发现 nil

Swift - 在展开可选值时意外发现 nil - 从委托调用变量

在 Swift 中使用 nil 值解析 JSON

变量显示为 nil - swift 4 IOS

Swift:尝试查询 api 时得到 nil

在 Swift 的 Objective-C++ 类中设置变量 --> 意外的 nil 崩溃