Введение

В нашей первой статье мы узнали, зачем нужен 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.

Комментарии (1)


  1. ioncorpse
    06.07.2023 11:48
    +2

    В нашей первой статье (на английском языке и не на Хабре) мы узнали, зачем нужен GraphQL. А теперь напишем примитив, при помощи горячего шоколада (что это такое - вам знать не нужно).
    Далее нажмите плюсик и сходите на наш бесплатный урок какой-то странной фигни. Всем спасибо, свободны.