#c# #api #xaml #uwp
#c# #API #xaml #uwp
Вопрос:
Я следил за руководством по погодному приложению UWP, которое использует ключ API.
Я получаю System.NullReferenceException
.
Это метод, в котором это происходит, в строке, начинающейся с RootObject
:
namespace UWP_Weather_App
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
RootObject myWeather = await OpenWeatherMapProxy.GetWeather(20.0, 30.0);
ResultTextBlock.Text = myWeather.name " - " myWeather.main.temp " - " myWeather.weather[0].description;
}
}
}
Комментарии:
1. Вы уверены, что это происходит в этой строке? Вы не получаете доступа ни к каким методам / свойствам объекта там (я предполагаю,
GetWeather
что это статический метод). Однако вторая строка содержит множество возможных причин этой ошибки.2. Разве OpenWeatherMapProxy не равен нулю?
3.
public async static Task<RootObject> GetWeather(double lat, double lon) { var http = new HttpClient(); var response = await http.GetAsync("http://api.openweathermap.org/data/2.5/weather?amp;appid=4440e0954b4016d22acceaf9d4be72fdamp;units=metric"); var result = await response.Content.ReadAsStringAsync(); var data = JsonConvert.DeserializeObject<RootObject>(result); return data; }
Это то, что находится внутри OpenWeatherMapProxy. Извините за форматирование кода, я знаю, что это ужасно.
Ответ №1:
Согласно вашему описанию, я бы предположил, что вы следуете этому руководству по погоде UWP. Я использовал ваш код с исходным кодом этого руководства и воспроизвел вашу проблему.
System.NullReferenceException
Ошибка произошла в строке ResultTextBlock.Text = myWeather.name " - " myWeather.main.temp " - " myWeather.weather[0].description;
Это потому, что URL, который вы использовали в GetWeather
методе, неверен. Результат, возвращаемый этим URL, не содержит информации о погоде, и когда он десериализуется в RootObject
, большинство свойств будут равны нулю.
Чтобы получить текущие данные о погоде по географическим координатам, мы можем использовать следующий API:
api.openweathermap.org/data/2.5/weather?lat={lat}amp;lon={lon}
И начиная с 9 октября 2015 года для доступа к этому API требуется действительный APPID. Для получения дополнительной информации, пожалуйста, смотрите Данные о текущей погоде вызова для одного местоположения и как использовать ключ API в вызове API.
Поэтому мы можем изменить GetWeather
метод следующим образом, чтобы исправить эту ошибку.
public async static Task<RootObject> GetWeather(double lat, double lon)
{
var http = new HttpClient();
var response = await http.GetAsync($"http://api.openweathermap.org/data/2.5/weather?lat={lat}amp;lon={lon}amp;appid={APIKEY}amp;units=metric");
var result = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<RootObject>(result);
return data;
}
Пожалуйста, обратите внимание, что я пытался использовать ваш ключ API, но я получил 401 Invalid API key
ошибку, поэтому, пожалуйста, убедитесь, что вы используете правильный ключ. И также, нам нужно изменить тип Main.pressure
и Wind.deg
на double
, поскольку их значения не являются int
. Если мы не изменим тип, мы можем получить Newtonsoft.Json.JsonReaderException
во время десериализации.
Комментарии:
1. Большое вам спасибо, это именно то, что было неправильно. Спасибо, что нашли время помочь. Последний вопрос, когда я запускаю приложение, оно сообщает, что местоположение — Земля, а не мой город и страна (Голуэй, Ирландия). Есть ли у вас какие-либо идеи, как это исправить?
2. @Lynskey08 Какие координаты вы использовали? Я попробовал со следующим вызовом API:
http://api.openweathermap.org/data/2.5/weather?q=Galway,ieamp;appid={APIKEY}
, он работает хорошо.3. Я только после обновления координат до координат моего общего местоположения. Большое вам спасибо, что код сработал идеально. Вы джентльмен, что нашли время помочь мне. Он даже напечатал Galway на ирландском для меня 🙂