【问题标题】:OpenWeatherMap API does not find all citiesOpenWeatherMap API 无法找到所有城市
【发布时间】:2021-08-10 01:41:02
【问题描述】:

我正在学习本教程 (https://www.youtube.com/watch?v=QMR6N6Vs_x0&feature=emb_err_woyt) 并将代码用于 Apple Watch 应用程序。所以一切正常。

奇怪的是,并非我输入的所有城市都被接受。它给出了错误(参见代码)“用户输入不正确!”。但是,当我复制并粘贴生成的 url 并且由于代码不正确时,它将在浏览器中工作。它将接受该输入。但我的应用不会。

我已经搜索过,但找不到类似的东西。我认为这是一件很小的事情。

import Foundation

final class NetService: ObservableObject {

@Published var weather: WeatherData?
@Published var city = ""

let baseURL = URL(string: "https://api.openweathermap.org/data/2.5/weather")!
var query = ["q": "", "appid": "", "units": "metric"]

func loadWeatherInfo(by city: String) {

    guard baseURL.withQueries(query) != nil, city != "" else { print("URL isn't correct!"); return}

    query["appid"] = "HERE I PUT MY OWN API-KEY"
    query["q"] = city

    URLSession.shared.dataTask(with: baseURL.withQueries(query)!) { data, _, error in
        print(self.baseURL.withQueries(self.query)!)
        guard let data = data else { print(#line, #function, "\(error!.localizedDescription)"); return }

        if let weatherInfo = try? JSONDecoder().decode(WeatherData.self, from: data) {
            DispatchQueue.main.async { [weak self] in
                self?.weather = weatherInfo
            }
        } else {
            print(#line, #function, "incorrect user input!"); return
        }
    }.resume()
}
}

所以我的问题是,为什么我的代码不能接受所有城市。我收到有关“Zeist”、“Woerden”、“Gent”等的错误。如果我从控制台复制“构建 url”(https://api.openweathermap.org/data/2.5/weather?q=Zeist&appid=HERE I PUT MY OWN API-KEY&units=metric),当我将其粘贴到 Safari 中时,我会得到一个返回。所以这座城市得到了认可。

{"coord":{"lon":5.23,"lat":52.09},"weather":[{"id":800,"main":"Clear","description":"晴空" ,"icon":"01d"}],"base":"stations","main":{"temp":11.84,"feels_like":10.18,"temp_min":11.11,"temp_max":12.78,"pressure ":1020,"湿度":58},"风":{"速度":0.45,"度":264,"阵风":2.68},"云":{"全部":7},"dt" :1589534449,"sys":{"type":3,"id":2005313,"country":"NL","sunrise":1589514260,"sunset":1589570804},"timezone":7200,"id" :2743977,"name":"Zeist","cod":200}

所以 url 是正确构建的。

感谢阅读,希望有解决办法。

【问题讨论】:

  • 请显示您的 WeatherData 对象,因为这里的问题似乎是 JSON 解析,而不是用户输入。
  • 正如@EricAya 所说,您的模型无法解析。可能您有一个非可选属性,返回的数据未填充。查看这些城市的 API 响应,看看是否有任何字段为空,如果不能保证填充它们,那么您应该将模型中的属性设为可选。

标签: swift xcode11 openweathermap watchos-6


【解决方案1】:

感谢这篇文章上方的 cmets,我找到了解决方案。在我的 WeatherData 中,visibility 是我从 OpenWeatherMap 收集的。并非所有城市都将“可见性”作为输出,因此我将其设为可选项,现在可以使用了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多