GraphQL в .NET: Практическое использование

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Введение

В нашей первой статье мы узнали, зачем нужен GraphQL и в чем различия между GraphQL и REST. Начиная с этой статьи, мы углубимся в детали практического использования GraphQL.

GraphQL на практике

Существует множество библиотек для работы с GraphQL на платформе .NET, и одна из них называется Hot Chocolate.

Являясь библиотекой и сервером graphQL, Hot Chocolate защищает нас от тонкостей и сложностей, которые присущи graphQL.

PS: Пожалуйста, используйте репозиторий graphQL для примеров.

Давайте выполним следующие шаги, чтобы применить GraphQL на практике: (проект 001_GraphQLEssentials из репозитория)

  1. Выберите пустой проект asp.net core из Visual Studio. (Если вы не используете Visual Studio, создайте проект, написав "dotnet new web" в любой папке)

  2. Установите библиотеку hotchocolate, набрав install-package hotchocolate.aspnetcore

  3. Перейдите в файл Program.cs и внесите следующие изменения.

using _001_GraphQLEssentials.Queries;

namespace _001_GraphQLEssentials
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            builder.Services.AddGraphQLServer()
                .AddQueryType<Query>();

            var app = builder.Build();

            app.MapGraphQL();

            app.Run();
        }
    }
}

AddGraphQLServer() позволяет нам добавить сервер Hotchocoloate graphQL для работы с graphQL. Также с помощью метода AddQueryType() мы выбираем тип, по которому graphQL будет выполнять обмен данными. Наконец, мы настраиваем маршрутизацию с помощью MapGraphQL(). По умолчанию установлена маршрутизация /graphql.

4) Добавим наши модели, которые будут участвовать в обмене данными.

public class Customer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public List<Card> Cards { get; set; }
    }

 public class Card
    {
        public int Id { get; set; }
        public string Number { get; set; }
        public string CVC { get; set; }
        public string ExpiryDate { get; set; }
    }

5) Имплементируем слой данных с помощью метода GetCustomers.

namespace _001_GraphQLEssentials.Queries
{
    public class Query
    {
        public IEnumerable<Customer> GetCustomers()
        {
            return new
                Customer[]
            {
                new Customer{ Id = 1, Email = "bakihanma@gmail.com", Name = "Baki",
                Cards = new List<Card>()
                {
                    new Card{ Number = "1234-1234-4444", CVC="653", ExpiryDate="08/28", Id = 1},
                    new Card{ Number = "7766-1234-4444", CVC="765", ExpiryDate="08/26", Id = 2},
                } },
                new Customer{ Id = 2, Email = "hanayamakaoru@gmail.com", Name = "Hanamayama",
                 Cards = new List<Card>()
                {
                    new Card{ Number = "7878-3333-4444", CVC="222", ExpiryDate="08/28", Id = 3},
                    new Card{ Number = "7766-6789-1234", CVC="111", ExpiryDate="08/26", Id = 4},
                } },
                new Customer{ Id = 3, Email = "orochi@gmail.com", Name = "Doppo",
                 Cards = new List<Card>()
                {
                    new Card{ Number = "1234-1234-5456", CVC="123", ExpiryDate="08/28", Id = 5},
                    new Card{ Number = "8888-4444-4532", CVC="345", ExpiryDate="08/26", Id = 6},
                } },
                new Customer{ Id = 4, Email = "dorian@gmail.com", Name = "Dorian", Cards = new List<Card>()
                {
                    new Card{ Number = "8989-5555-4444", CVC="567", ExpiryDate="08/28", Id = 7},
                    new Card{ Number = "7766-6666-4444", CVC="789", ExpiryDate="08/26", Id = 8},
                } },
            };
        }
    }
}

После того как все готово, мы можем запустить приложение и протестировать его.

Выбрав "Create document" (создать документ) в маршрутизации /graphql, мы можем увидеть веб-версию приложения "banana Cake Pop", подтвердив заданную форму.

Из раздела "Schema reference" мы можем легко увидеть "внутреннюю" структуру модели, которую будем запрашивать. Как видно из этой модели, чтобы увидеть "имя" клиента, необходимо указать путь в форме CustomerQuery: customers: name.

Но поскольку мы указали модель CustomerQuery в AddQueryType() в Program.cs, достаточно будет просто маршрутизации в виде customers: name.

Кейсы запросов

Если мы хотим получить все данные в качестве клиентов, следующий запрос не сработает.

Если мы хотим получить все данные для клиентов.

Как мы видим, формат graphQL отчасти похож на JSON. Но в отличие от JSON, значения атрибутов не указываются, а просто разделяются новой строкой.

В GraphQL запросы делятся на 2 группы.

  1. Query = HTTP GET в REST

  2. Mutation = POST, PUT, DELETE, PATCH.

Типичный запрос GraphQL — это запрос HTTP POST.  HTTP POST используется как для запросов, так и для мутаций: Queries и Mutations.

HTTP GET используется для Persisted Queries (персистентных запросов).

Заключение

Однако GraphQL является  transport agnostic (транспортно-независимый), то есть он не зависит от какого-либо конкретного протокола. Для GraphQL вы можете использовать HTTP, сокет, grpc и т.д.

12 июля в OTUS пройдет открытый урок, посвященный примитивам многопоточности .Net.

На этом уроке разберем такие примитивы многопоточности, как барьеры, условные события (ManualResetEvent/AutoResetEvent), потоко-безопасные очереди (блокируемые и неблокируемые). Обсудим, как писать код без Thread.Sleep, где еще можно использовать многопоточность, чем отличается многопоточный код от асинхронного.

Урок будет полезен разработчикам уровня Junior и Middle, кто желает улучшить свое понимание внутреннего устройства платформы .Net, а также тем, что использует Thread.Sleep.

  • Записаться на открытый урок

Источник: https://habr.com/ru/companies/otus/articles/746126/


Интересные статьи

Интересные статьи

В середине мая открылась свободная регистрация имен в доменных зонах .ZIP и .MOV. Эти TLD вошли в список из сотен коммерческих доменных зон, обслуживанием которых занимаются частные компании. В данном...
Когда руководителю предлагают испытать в работе новый стандарт, у него возникает резонный вопрос — какую пользу это принесёт предприятию? Особенно когда речь идёт о «необязательных» стандартах, таких ...
Статья Social media usage in the United States - Statistics & Facts опубликована исследовательским департаментом Statista  23 февраля 2022. При переводе статьи мы проверили и обновили не...
При bleeding edge разработке или просто в рамках экспериментов, приходиться добавлять патчи прямиком из maillists.Скачивать серию вручную и сохранять в mbox можно действительно озвереть, даже не смотр...
Clickhouse — это столбцовая система управления базами данных для онлайн обработки аналитических запросов (OLAP) с открытым исходным кодом, созданная Яндексом. Ее используют Яндекс, CloudFlare, VK...