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. Не все города имеют "видимость" на выходе, поэтому я сделал это необязательным, и теперь он работает!

Другие вопросы по тегам