C# Работа с API (на примере сайта OpenWeatherMap)

Начинающий
Статус
Оффлайн
Регистрация
17 Дек 2018
Сообщения
27
Реакции[?]
19
Поинты[?]
0
Всем привет. Данная статья рассчитана больше для новичков.

Часто ли вы встречали на сайтах кнопку "Для разработчиков" и тп? Чаще всего, это кнопка отсылает нас к различным документациям по работе с сайтом, API и тп. Что такое API? Простыми словами, это некоторый способ взаимодействия вашей программы и сайта. Чаще всего, взаимодействие осуществляется через запросы на какой-либо сайт, с указанием вашего APIKeys.

Итак, перед началом написания кода получим данный APIKeys.

1. Заходим на сайт "
Пожалуйста, авторизуйтесь для просмотра ссылки.
", регистрируемся, переходим на вкладку API, тыкаем сверху Sign In и API keys. Далее, генерируем свой API keys
Пожалуйста, авторизуйтесь для просмотра ссылки.
(в бесплатной подписке данного сайта можно генерировать только 1 ключ. Если ключей у вас будет больше, сайт не будет их принимать. Удалите лишние)

2. Итак, ключ для подключения к сайту у нас есть. Что делаем дальше?
Открываем нашу любимую Visual Studio (у меня 2017 года) и создаём консольное приложение (по аналогии можно сделать так же с формой).
Далее, вводим все using, которые нам чуть позже пригодятся:
C#:
using System;
using Newtonsoft.Json;
using System.IO;
using System.Net;
using System.Threading.Tasks;
Далее создаём метод, который будет заходить на наш сайт, брать оттуда информацию и возвращать её нам:
C#:
public static async Task ConnectAsync()
{

}
(весь код, который будет далее написан, необходимо писать сюда)

Для начала подключимся к нашему api следующим запросом:
WebRequest request = WebRequest.Create("https://api.openweathermap.org/data/2.5/weather?id=" + CountryID + "&units=metric&APPID=APPID, КОТОРЫЙ ВЫ СГЕНЕРИРОВАЛИ");
С помощью объекта Request мы создаём запрос по указанной ссылке. Откуда я взял эту ссылку и почему мы делаем запрос именно по ней? Открываем документацию и смотрим:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Что мы здесь видим? При подключении к данному сайту, он "читает" ID нашего города, а затем ApiKey. Для того, чтобы получать данные не только с одного и того же города, введём string переменную CountryID, которую чуть позже опишем (пусть пока что просто будет и всё)
&units=metric - преобразование температуры в градусы

Далее, вставляем следующий код:
C#:
request.Method = "POST";
WebResponse response = await request.GetResponseAsync();
С помощью метода POST (есть ещё GET. Советую почитать документацию об этом в интернете) и GetResponse мы возвращаем ответ на интернет запрос, который после мы преобразуем в WebResponse, присвоив его к новому значению response.

Чтож, далее считываем всё, что мы получили с сайта при помощи следующих строк:
C#:
using (Stream s = response.GetResponseStream())
{
    using (StreamReader reader = new StreamReader(s))
    {
        answer = await reader.ReadToEndAsync();
    }
}
(на самом деле, это можно записать вот так и результат будет точно таким же, но для понимания лучше разделить)
C#:
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    answer = await reader.ReadToEndAsync();
}
Данным кодом мы считываем данные с нашего объекта-переменной (response).
Оператор (не директива) using используем для очистки всех "ресурсов" и более правильного завершения работы с
Пожалуйста, авторизуйтесь для просмотра ссылки.
(документация:
Пожалуйста, авторизуйтесь для просмотра ссылки.
)

Далее, закроем наше чтение с помощью команды Close():
response.Close();

Уже на данном этапе можно просмотреть, какие данные мы получили при помощи визуализатора json:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Таким образом, у нас должен получится следующий метод:
C#:
public static async Task ConnectAsync()
{
    WebRequest request = WebRequest.Create("https://api.openweathermap.org/data/2.5/weather?id=" + CountryID + "&units=metric&APPID=??????????");
    request.Method = "POST";
    WebResponse response = await request.GetResponseAsync();
    string answer = string.Empty;
    using (Stream s = response.GetResponseStream())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            answer = await reader.ReadToEndAsync();
        }
    }
    response.Close();
}
3. Подключим наш метод к Main
Вспоминаем про нашу переменную CountryID и перед методом Main вставляем:
public static string CountryID;

Далее, у нас должен получится следующий код в методе Main:
C#:
static void Main(string[] args)
{
    Console.Write("Введите ID города: ");
    CountryID = Console.ReadLine();
    try
    {
        ConnectAsync().Wait();
        Console.WriteLine("Успешно");
    }
    catch
    {
        Console.Write("Город не найден или что-то пошло не так");
    }
    Console.ReadKey();
}
С помощью Try-Catch проверяем, получен ли ответ от сервера по нашему запросу. Если выдаёт ошибку, выводим текст об этом. Также, можно немного изменить catch, добавив Exception ex:
C#:
catch (Exception ex)
{
    Console.WriteLine(ex);
    Console.Write("Город не найден или что-то пошло не так");
}
В данном случае, у нас будет появляется информация о том, что пошло не так.

Итак, мы получили какие-то данные с сервера в JSON, но нам их нужно как-то вывести (если хотите посмотреть, как это выглядит, нажмите тоже самое, что на скриншоте:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Подключаем библиотеку Newtonsoft.Json через NuGet.

Создаём класс Weather.cs и вписываем в него следующий код:
C#:
namespace Test
{
    public class Temperatura
    {
        public double temp;
    }

    public class WeatherNow
    {
        public string main;
        public string description;
    }

    public class WeatherResponse
    {
        public Temperatura main;
        public string name;
        public WeatherNow[] weather;
    }
}
Возвращаемся обратно в Program.cs и дописываем после Close()
C#:
WeatherResponse response_global = JsonConvert.DeserializeObject<WeatherResponse>(answer);
Console.WriteLine("Средняя температура в данный момент в городе " + response_global.name + " = " + response_global.main.temp);
Console.WriteLine("Погода за окном: \n" + response_global.weather[0].main + "\n" + response_global.weather[0].description);
1 строка - конвертируем из нашего Json объекта информацию в читабельный текст, который можно выводить и тп
2 строка - выводим информацию по данному городу.
3 строка - выводим погоду по данному городу
Обратите внимание!!!
Пожалуйста, авторизуйтесь для просмотра ссылки.
Данные названия ОБЯЗАТЕЛЬНО должны совпадать. Иначе всё будет плохо, землетрясение, катаклизмы разные и тп.
Кароч, обращайте на это внимание

Таким образом, в конце должно получится:
2 класса (Program.cs и Weather.cs)
В Weather.cs -
Пожалуйста, авторизуйтесь для просмотра ссылки.

В Program.cs -
Пожалуйста, авторизуйтесь для просмотра ссылки.

Результат работы:
Пожалуйста, авторизуйтесь для просмотра ссылки.


P.S. ID брать на сайте в адресной строке при открытии определённого города.
Например: https:// openweathermap .org/city/1486209 - Екатеринбург
https:// openweathermap .org/city/524901 - Москва

Ссылка на готовую программу:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
574
Реакции[?]
251
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
По моему мнению - самый лучший и подробный гайд по работе с API сайта в программе при помощи C#.
 
Сверху Снизу