Создание десктопного клиента на C# для Web API

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 29.10.2015

В прошлой теме в качестве клиента использовались представления самого же проекта. Однако, как правило, клиентами могут выступать самые разные типы приложений. Рассмотрим подключение к Web API из консольного приложения, написанного на C#.

Создадим проект приложения Web API с типом аутентификации Individual User Accounts (или возьмем деланный в прошлой теме). Добавим в решение второй проект - проект консольного приложения.

Добавим в проект консольного приложения через Nuget пакет Microsoft.AspNet.WebApi.Client

Создание клиента для Web API на c#

Изменим код консольного приложения следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using Newtonsoft.Json;

namespace ConsoleClient
{
    class Program
    {
        private const string APP_PATH= "http://localhost:55122";
        private static string token;

        static void Main(string[] args)
        {
            Console.WriteLine("Введите логин:");
            string userName = Console.ReadLine();

            Console.WriteLine("Введите пароль:");
            string password = Console.ReadLine();

            var registerResult = Register(userName, password);

            Console.WriteLine("Статусный код регистрации: {0}", registerResult);

            Dictionary<string, string> tokenDictionary = GetTokenDictionary(userName, password);
            token = tokenDictionary["access_token"];

            Console.WriteLine();
            Console.WriteLine("Access Token:");
            Console.WriteLine(token);

            Console.WriteLine();
            string userInfo = GetUserInfo(token);
            Console.WriteLine("Пользователь:");
            Console.WriteLine(userInfo);

            Console.WriteLine();
            string values = GetValues(token);
            Console.WriteLine("Values:");
            Console.WriteLine(values);

            Console.Read();
        }

        // регистрация
        static string Register(string email, string password)
        {
            var registerModel = new
            {
                Email = email,
                Password = password,
                ConfirmPassword = password
            };
            using (var client = new HttpClient())
            {
                var response = client.PostAsJsonAsync(APP_PATH + "/api/Account/Register", registerModel).Result;
                return response.StatusCode.ToString();
            }
        }
        // получение токена
        static Dictionary<string, string> GetTokenDictionary(string userName, string password)
        {
            var pairs = new List<KeyValuePair<string, string>>
                {
                    new KeyValuePair<string, string>( "grant_type", "password" ), 
                    new KeyValuePair<string, string>( "username", userName ), 
                    new KeyValuePair<string, string> ( "Password", password )
                };
            var content = new FormUrlEncodedContent(pairs);

            using (var client = new HttpClient())
            {
                var response =
                    client.PostAsync(APP_PATH + "/Token", content).Result;
                var result = response.Content.ReadAsStringAsync().Result;
                // Десериализация полученного JSON-объекта
                Dictionary<string, string> tokenDictionary =
                    JsonConvert.DeserializeObject<Dictionary<string, string>>(result);
                return tokenDictionary;
            }
        }

        // создаем http-клиента с токеном 
        static HttpClient CreateClient(string accessToken = "")
        {
            var client = new HttpClient();
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                client.DefaultRequestHeaders.Authorization =
                    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
            }
            return client;
        }

        // получаем информацию о клиенте 
        static string GetUserInfo(string token)
        {
            using (var client = CreateClient(token))
            {
                var response = client.GetAsync(APP_PATH + "/api/Account/UserInfo").Result;
                return response.Content.ReadAsStringAsync().Result;
            }
        }

        // обращаемся по маршруту api/values 
        static string GetValues(string token)
        {
            using (var client = CreateClient(token))
            {
                var response = client.GetAsync(APP_PATH + "/api/values").Result;
                return response.Content.ReadAsStringAsync().Result;
            }
        }
    }
}

Вначале устанавливаем две глобальные переменные для адреса сайта и токена:

private const string APP_PATH= "http://localhost:55122";
private static string token;

После ввода emailа и пароля вывызвается метод Register(), который отправляет регистрационные данные по маршруту /api/Account/Register

Зарегистрировавшись, мы можем получить токен с помощью метода GetTokenDictionary(). Так как возвращаемый сервером объект представляет набор ключей и значений в формате json, то его можно преобразовать к словарь Dictionary, а из него по ключу получить сам токен:

Dictionary<string, string> tokenDictionary = GetTokenDictionary(userName, password);
token = tokenDictionary["access_token"];

Получив токен, уже можно отправлять запросы к любым защищенным ресурсам. Например, далее отправляется запрос по маршруту /api/Account/UserInfo для получения данных о пользователе. И также отправляется запрос к методу Get контроллера ValuesController.

Для отправки запросов к серверу во всех методах используется класс HttpClient.

Для упрощения запросов с токеном создан вспомогательный метод CreateClient(), который устанавливает токен в заголовках авторизации и возвращает объект HttpClient.

static HttpClient CreateClient(string accessToken = "")
{
    var client = new HttpClient();
    if (!string.IsNullOrWhiteSpace(accessToken))
    {
        client.DefaultRequestHeaders.Authorization =
            new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
    }
    return client;
}

Запустив параллельно оба проекта на выполнение, можно протестировать их взаимодействие:

Тестирование клиента для Web API на c#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850