Автор оригинала: Hugo Di Francesco.
GraphQL – отличная альтернатива для отдыха (или других конструкций HTTP API). Это быстрое введение в основные концепции вокруг потребляющий API GraphQL.
Чтобы увидеть некоторые примеры, которые потребляют API GraphQL:
- В Python см. Python GraphQL клиент Запросы на примере использования GQL
- В JavaScript Браузер и узел, см. Код на прошлой неделе с Hugo Newsletter
Что такое graphql и какие проблемы это решают?
Graphql это «Язык запроса для вашего API» Отказ
На простом английском он делает клиент определить, что (вложенные) данные им нужны.
Если мы сравним это с Отдых Подходы:
- «Чистый» подход для отдыха – возвращать идентификаторы (или ссылки на ресурсы) для любых ассоциаций (или вложенных ресурсов).
- Менее чистый подход – расширить все вложенные материалы.
Первая ситуация приводит к тому, чтобы сделать много звонков для получения всех данных. Второе приводит к огромным полезным нагрузкам и медленному времени нагрузки.
В GraphQL клиентские состояния в запросе то, что он хочет расширен, переименован или все остальное в ответ.
Он имеет несколько хороших побочных эффектов, например, меньше необходимости версию вашу API, поскольку клиент определяет то, что он хочет, и GraphQL имеет способ уникальных полей.
Схема
Graphiql , «IDE в браузере для изучения графаQL». Доступен, навигации по конечной точке в вашем браузере. Можно генерировать схему с помощью CLI GraphQL (требуется узел + NPM 5+):
npx graphql-cli get-schema --endpoint $BASE_URL/api/graphql --no-all -o schema.graphql
Запрашивает
Концепции запроса GraphQL
Полей
Что мы хотели бы вернуть в запрос, посмотреть Документация GraphQL для «Поля» Отказ Запрос GraphQL для этого возвращает поля Имя , Фервет , MaxCP , Maxhp следующее:
{
pokemon(name: "Pikachu") {
name
fleeRate
maxCP
maxHP
}
}Аргументы
Как мы собираемся отфильтровать данные запроса вниз, см. Документация GraphQL для «аргументов» Отказ Чтобы получить имена первых 10 покемонов, которые мы используем Покемоны (первые: 10) {поля} Чтобы увидеть вывод здесь :
{
pokemons (first: 10) {
name
fleeRate
maxCP
maxHP
}
}Псевдонимы
Псевдонимы дают нам возможность переименовывать поля. (См. Документация GraphQL для «псевдонимов» ). Мы на самом деле собираемся использовать его для отображения полей карты в запросе, например. от верблюда до змеи:
{
pokemon(name: "Pikachu") {
evolution_requirements: evolutionRequirements {
amount
name
}
}
}Запуск этого запроса ( здесь ) дает нам следующее, где EvolutionRequirements Это то, что мы псевдоним это.
{
"data": {
"pokemon": {
"evolution_requirements": {
"amount": 50,
"name": "Pikachu candies"
}
}
}
}Фрагменты
Определение полей, которые будут расширены на типе. Это способ сохранить заправки сухих и вообще разделить определения поля, которые повторяются, повторно используются или глубоко вложены, см. Документация GraphQL для фрагментов Отказ Это будет означать, что вместо того, чтобы делать ( см. Запрос в действии здесь ):
{
pokemon(name: "Pikachu") {
weight {
minimum
maximum
}
height {
minimum
maximum
}
}
}Например, мы можем запустить это ( Query здесь ):
{
pokemon(name: "Pikachu") {
weight {...FullPokemonDimensions}
height {...FullPokemonDimensions}
}
}
fragment FullPokemonDimensions on PokemonDimension {
minimum
maximum
}Вывод эквивалентен:
{
"data": {
"pokemon": {
"weight": {
"minimum": "5.25kg",
"maximum": "6.75kg"
},
"height": {
"minimum": "0.35m",
"maximum": "0.45m"
}
}
}
}Запуск запроса GraphQL
Запрос GraphQL можно запустить пост или получить, он состоит из:
Пост (рекомендуется)
- Требуемые заголовки:
Тип содержимого: приложение/JSON - Требуется параметр тела JSON:
Запрос: {# Вставьте свой запрос}
RAW HTTP-запрос
POST / HTTP/1.1
Host: graphql-pokemon.now.sh
Content-Type: application/json
{
"query": "{ pokemons(first: 10) { name } }"
}скручивание
curl -X POST \
https://graphql-pokemon.now.sh/ \
-H 'Content-Type: application/json' \
-d '{
"query": "{ pokemons(first: 10) { name } }"
}'ПОЛУЧАТЬ
- Требуемый запрос Paral:
запрос
RAW HTTP-запрос
GET /?query={%20pokemons(first:%2010)%20{%20name%20}%20} HTTP/1.1
Host: graphql-pokemon.now.shскручивание
curl -X GET 'https://graphql-pokemon.now.sh/?query={%20pokemons%28first:%2010%29%20{%20name%20}%20}'Запросы верхнего уровня
На 2 типа запросов на Graphql pokemon api
- Первый X Pokemon: Получите все предметы (с любыми полями определены в запросе)
- Одиночный покемон по названию: получите один элемент по его слизме (с помощью любых полей определены в запросе)
- Одиночный покемон по ID: получите один элемент по его слизме (с помощью любых полей определены в запросе)
Первый х покемон
Запросы формы ( Увидеть его в действии в Graphiql ):
{
pokemons(first: 5) {
name
# other fields
}
}Одиночный покемон по имени
Запросы формы ( Увидеть его в действии в Graphiql ):
{
pokemon(name: "Pikachu") {
name
classification
# other fields
}
}Одиночный покемон по ID
Запросы формы ( Увидеть его в действии в Graphiql ):
{
pokemon(id: "UG9rZW1vbjowMjU=") {
name
classification
# other fields
}
}Образец запросов
Получите какой-нибудь покемон, чтобы создать крепость/слабость/классификацию сопротивления
Запрос ( Увидеть его в Graphiql ):
{
pokemons(first: 100) {
name
image
maxHP
types
weaknesses
resistant
}
}Получить покемонов и эволюцию расширены для физической статистики и атаки
Запрос ( Увидеть его в Graphiql ):
{
pokemon(name: "Pikachu") {
...PokemonWithAttack
...FullPhysicalStats
evolutions {
...FullPhysicalStats
...PokemonWithAttack
}
}
}
fragment PokemonWithAttack on Pokemon {
name
attacks {
fast {
name
type
damage
}
special {
name
type
damage
}
}
}
fragment FullPhysicalStats on Pokemon {
height { ...FullDimension }
weight { ...FullDimension }
}
fragment FullDimension on PokemonDimension {
minimum
maximum
}Получите выбранный покемон как названные поля с именами эволюции
Запрос ( Увидеть его в graphiql ).
Мы можем переименовать запросы верхнего уровня, используя псевдонимы. Это полезно, если мы хотим сделать следующее:
{
pikachu: pokemon(name: "Pikachu") {
...FullPokemon
evolutions {
...FullPokemon
}
}
bulbasaur:pokemon(name: "Bulbasaur") {
...FullPokemon
evolutions {
...FullPokemon
}
}
}
fragment FullPokemon on Pokemon {
name
}Если вы хотите узнать, как интегрироваться с API GraphQL:
– В Python см. Python GraphQl Client Запросы Пример Использование GQL – в JavaScript Браузер и узел, см. Код на прошлой неделе с Hugo Newsletter
Читать дальше моих статей на моем сайте, Код с Hugo Отказ