OpenWeatherMap API не находит все города
Я следил за этим руководством (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":"station","main":{"temp":11.84,"feel_like":10.18,"temp_min":11.11,"temp_max":12.78,"pressure":1020,"влажность":58},"ветер": {"скорость": 0,45,"град":264,"порыв": 2,68},"облака":{"all":7},"dt":1589534449,"sys":{"type":3,"id":2005313,"country":"NL","sunrise":1589514260,"sunset":1589570804},"timezone":7200,"id":2743977,"name":"Zeist","cod":200}
Итак, URL-адрес построен правильно.
Спасибо, что прочитали, надеюсь, есть решение.
1 ответ
Благодаря комментариям над этим сообщением я нашел решение. В моих WeatherData видимость - это то, что я собираю из OpenWeatherMap. Не все города имеют "видимость" на выходе, поэтому я сделал это необязательным, и теперь он работает!