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

  • Автор темы Автор темы Frehzy
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
17 Дек 2018
Сообщения
35
Реакции
19
Всем привет. Данная статья рассчитана больше для новичков.

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

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

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

2. Итак, ключ для подключения к сайту у нас есть. Что делаем дальше?
Открываем нашу любимую Visual Studio (у меня 2017 года) и создаём консольное приложение (по аналогии можно сделать так же с формой).
Далее, вводим все using, которые нам чуть позже пригодятся:
C#:
Expand Collapse Copy
using System;
using Newtonsoft.Json;
using System.IO;
using System.Net;
using System.Threading.Tasks;
Далее создаём метод, который будет заходить на наш сайт, брать оттуда информацию и возвращать её нам:
C#:
Expand Collapse Copy
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#:
Expand Collapse Copy
request.Method = "POST";
WebResponse response = await request.GetResponseAsync();
С помощью метода POST (есть ещё GET. Советую почитать документацию об этом в интернете) и GetResponse мы возвращаем ответ на интернет запрос, который после мы преобразуем в WebResponse, присвоив его к новому значению response.

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

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

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


Таким образом, у нас должен получится следующий метод:
C#:
Expand Collapse Copy
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#:
Expand Collapse Copy
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#:
Expand Collapse Copy
catch (Exception ex)
{
    Console.WriteLine(ex);
    Console.Write("Город не найден или что-то пошло не так");
}
В данном случае, у нас будет появляется информация о том, что пошло не так.

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


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

Создаём класс Weather.cs и вписываем в него следующий код:
C#:
Expand Collapse Copy
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#:
Expand Collapse Copy
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 - Москва

Ссылка на готовую программу:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
По моему мнению - самый лучший и подробный гайд по работе с API сайта в программе при помощи C#.
 
Назад
Сверху Снизу