Рубрики
Без рубрики

GraphQL, от теории к реальному миру с Spring-boot

Эта статья является первой частью серии статей, которые мы рассмотрим. Сериал о М… С тегами java, graphql, spring boot, api.

Эта статья является первой частью серии статей, которые мы рассмотрим. Серия посвящена освоению необходимых основных концепций спецификации GraphQL для настройки реального примера реализации на стороне сервера с помощью spring boot. Каждый эпизод предназначен для самостоятельного просмотра, поэтому не стесняйтесь начинать с того, что вас больше всего интересует.

  • Основные концепции GraphQL (этот) 📈 Начало работы с основными концепциями GraphQL для создания реального примера

  • Первый GraphQL API и эффективная обработка ошибок GraphQL в Spring-boot 🧯

  • Защитите свои API-интерфейсы GraphQL с помощью Spring-boot 👮 ♂ ️ Настройте уровень контроля доступа в ваших API, чтобы определить, кто может иметь доступ к какому, если ваши API-интерфейсы

  • Тестирование ваших API-интерфейсов GraphQL в приложении Spring-boot 🚀 Написание модульных и интеграционных тестов для ваших API-интерфейсов GraphQL Настройте свой проект Spring-boot и предоставьте свою первую конечную точку GraphQL, чтобы получить глубокое представление о механизмах обработки ошибок GraphQL.

Что такое GraphQL?

Это новый стандарт API, разработанный и используемый Facebook с 2012 года, но с открытым исходным кодом с 2015 года. Это более гибкая и мощная альтернатива REST. Спецификация GraphQL имеет быстро растущее сообщество, и некоторые из популярных компаний, которые ее используют, – это Github, Coursera, Twitter, Shopify, yelp, и это лишь некоторые из них.

Идея, лежащая в основе REST, великолепна, поскольку она пропагандирует использование серверов без состояния и структурированный доступ к ресурсам. Но есть недостатки, такие как неэффективность и отсутствие гибкости, с которыми сталкиваются разработчики, и именно поэтому GraphQL был разработан для. Чтобы лучше проиллюстрировать различия, мы представим приложение для социальных покупок (SSApp), которое мы собираемся разрабатывать вместе с этой серией. SSApp: Наше приложение состоит из пользователей, просматривающих некоторые торговые статьи в приложении, которые им могут понравиться и которые они могут купить. Пользователи могут продавать статьи и следить за другими пользователями, чтобы они могли проверять их действия в приложении. Вот и все! Хорошо, давайте вернемся к иллюстрации, предположим, что мы хотим отобразить начальный экран пользователя:

Для достижения этой цели REST: Нам нужны 3 конечные точки API с сервера: /пользователи/<идентификатор> Возвращающийся:

{
  "user": {
    "id": "flkzopgz12"
    "name": "Samanta Calgon"
    "address": {...}
    "birthday": "May 15, 1995"
  }
}

Обратите внимание, что нам просто нужно имя , но на данный момент мы извлекаем бесполезные дополнительные данные. Мы истощаем пользовательский тарифный план. Фейспалм Затем:

/пользователи/<идентификатор>/статьи?понравилось=верно Возвращающийся:

{
  "articles": [{
    "id": "dmflgmjlsfgs4z545"
    "title": "Vuicci Sweet Shirt",
    "description": "Lorem ipsum ...",
    "liked": "true"
    "reviews": [...]
  },{
    "id": "dlkfjge919zzz"
    "title": "Diara Eau de Parfum",
    "description": "dolor epsumet ...",
    "liked": "true"
    "reviews": [...]
  },{...}
  ...
  ]
}

На этот раз нам также просто нужно название статей. И /пользователи/<идентификатор>/подписчики Возвращающийся:

{
  "followers": [{
      "id" : "dlkfhosdid2e15",
      "name" : "Klark",
      "address": { ... },
      "birthday": "January 21, 1998"
    },{
      "id" : "94erg48h4j",
      "name" : "Rose",
      "address": { ... },
      "birthday": "January 21, 1998"
    },{ ... }    
    ... 
  ]
}

Здесь мы загружаем много данных, которые нам тоже не нужны. 🤦‍♂️

Тот факт, что мы получаем больше данных, чем нам по сути нужно, называется избыточной выборкой .

Тот факт, что мы не можем получить достаточно информации в одном запросе и должны отправить много запросов, чтобы собрать всю информацию, известен как проблема under fetching .

Да, вы можете адаптировать свой REST API к экрану так, чтобы он возвращал только данные, необходимые для отображения, используя так называемые модели представления.

Делая это, вы надежно связываете свои представления с конечными точками. Таким образом, каждый раз, когда представление будет развиваться, ваш API тоже будет развиваться. Что очень плохо сказывается на масштабируемости API.

К счастью, мы можем решить вышеуказанные проблемы с помощью GraphQL . 🔥

Мы можем получить то, что нам нужно, отправив только один запрос. GraphQL использует только одну конечную точку, обычно /graphql .

Отправка запроса в Graphql означает отправку post-запроса на эту конечную точку и описание в теле запроса, какие данные нам точно нужны от сервера.

query {
  User(id: "flkzopgz12") {
    name
    articles(liked: True) {
      title
    }
    followers{
      name
    }
  }
}

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

User.name , Пользователь->статьи.заголовок, Пользователь->followers.name .

Затем сервер обработает и сопоставит это описание с соответствующими методами для получения данных.

Эти методы известны как решатели .

Распознаватели получат данные из базы данных, другой веб-службы и т.д., Затем упакуют их в объект JSON и вернут клиенту.

{
  "data": {
    "user": {      
      "name": "Samanta Calgon", 
      "articles": [
        { "title": "Vuicci Sweet Shirt"}
        { "title": "Diara Eau de Parfum"}
        { "title": "Timiland Shoes"}
        { "title": "Lavis Jeans White Vintage"}
      ],
      "followers": [
        { name: "Klark"},
        { name: "Rose"},
        { name: "Rick"},
        { name: "Josh"},
      ]
    }
  }
}

Корневым полем части данных ответа GraphQL являются данные в соответствии со спецификацией GraphQL.

GraphQL vs REST в двух словах

Больше нет повторной и неполной выборки, нет необходимости адаптировать API-интерфейсы к представлению, что обеспечивает быструю итерацию продукта.

Более того, GraphQL использует строгую систему типов для определения cans и косяки вашего API. Вам просто нужно определить свои типы в Файле схемы , написанном на Языке определения схемы (SDL). Эта схема будет представлять собой контракт между интерфейсной и серверной командами, позволяя им работать независимо друг от друга по принципу API-first.

Язык определения схемы (SDL)

Это позволяет нам определить нашу схему, которая состоит из типов. Этот пример иллюстрирует отношение “один ко многим” между 2 типами:

type User {
  id: ID!                  # Value generated by the server
  name: String!            # String,Int,ID are built-in type
  age: Int!                # ! means age is required
  articles: [Article!]     # A user can be have many Articles
}
type Article {
  title: String!
  seller: User!            # An article is sold by a User
  description: String
}

В GraphQL извлеченные данные не фиксируются, как вы видели ранее, вы можете выбрать извлечение ТОЛЬКО пользовательских статей или извлечение ПРОСТО возраст пользователя или даже ПРОСТО название статей пользователя. Клиент сам решает, что ему нужно

Одна важная вещь, на которую следует обратить внимание, заключается в том, что, поскольку мы не определили поле пароль в типе пользователя в схеме, это поле не может быть восстановлено клиентом. Больше не нужно беспокоиться о конфигурациях JsonIgnore . В этом сила системы строгих типов GraphQL. Сервер решает, что возможно или нет для клиента

Клиент сам решает, что ему нужно.

Сервер решает, что возможно или нет для клиента.

Клиент решает, что ему нужно, отправляя запросы на сервер Это три вида запросов:

  • Запрос : Извлечение данных
  • Мутация : Изменение данных
  • Подписка : Уведомления в реальном времени на основе событий

Примеры:

# Query
query{            #starts with the keyword query
  allUsers {
    name
  }
}
# returns
{
  "allUsers" : [
    {"name":"Samanta Calgon"},
    {"name":"Carlos Chavez"},
    ...
  ]
}
# Mutation
mutation{        #starts with the keyword mutation
  createUser(name: "Miguel Reyes", age: "21") {
    id
  }
}
# returns
{
  "createUser" : {
    "id" : "slkdjfr96f4d"
  }
}
# Subscription, listening to new articles creation
susbscription {    #starts with the keyword susbscription      
  newArticle {
    title
    description
    seller {
      name
    }  
  }
}
#When an article is created by another client, 
#while the subscription is active, this client will receives
{
  "Article" : {
    "title" : "Marins Jacket, green",
    "description" : "Real Marins Jacket refurbished from 2015"
    "seller" : {
      "name":"Carlos Chavez"
    }
  }
}

__The Server decides what is possible or not by defining the schema__

The schema, as mentioned earlier, is the contract between client and server, is written using SDL and defines the capabilities of the API by the means of GraphQL types.

Функционально мы можем видеть типы как 2 вида:

  • Типы для описания структуры данных, пользовательские и встроенные (Пользователь, статья, Строка, идентификатор, …)
  • Типы для описания точек входа, предоставляемых API (Запрос, Мутация и подписка)
#Custom and buitl-in Data Structure types
type User {
  id: ID!                  # Value generated by the server
  name: String!            # String,Int,ID are built-in type
  age: Int!                # ! means the field is required
  articles: [Article!]     # A user can be have many Articles
  followers: [User]
}
type Article {
  title: String!
  seller: User!            # An article is sold by a User
  description: String
}


#Types describing entrypoints
type Query {
  allUsers(last: Int): [User!]! #last parameter is optional
  user(id: Int): User       #No '!', The returned user can be empty
  #...
}
type Mutation {
  createUser(name: String, age: Int): User!
  #Want the client to create an article ? define the operation here
  #...
}
type Subscription {
  newArticle: Article! 
}

Теперь, когда у вас есть лучшее представление о том, что такое GraphQL, вы можете перейти к следующей части, которая посвящена написанию вашего первого GraphQL API с помощью Spring Boot.

GraphQL является лучшей альтернативой REST, поскольку он обеспечивает гибкость и эффективность при разработке приложений. Цель этой статьи – доказать это, объясняя основные концепции этой спецификации.

Тем не менее, GraphQL – это всего лишь спецификация, которая должна быть реализована как на стороне клиента, так и на стороне сервера. В следующих частях этой серии мы сосредоточимся на серверной части, особенно на Java и Spring-boot.

Обратная связь – это подарок 🎁 !

Оригинал: “https://dev.to/imphilippesimo/graphql-from-theory-to-real-world-with-spring-boot-3lpj”