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

Строительство APIS GraphQL с Vue.js и клиентом Apollo

Автор оригинала: Lucas Otero.

Вступление

Graphql это ориентированный на график запрос, написанный Facebook. В отличие от APIS-APIS, GraphQL вводит функции, которые делают разработку API более эффективным и в соответствии с моделями базы данных.

Характеристики GraphQL

  • В отличие от Отдых , есть только одна конечная точка, в которой будут отправлены все запросы. Поэтому вместо запроса /пользователи Чтобы получить список пользователей или /user/: id Чтобы получить определенный пользователь, конечная точка будет выглядеть как /graphql для всех запросов.
  • В GraphQL данные, возвращающиеся из ответа, установленные заявленными библиотекой запроса, и ее можно установить только для отправки немногих свойств данных, поэтому запросы в GraphQL имеют лучшую производительность.
  • Нет необходимости устанавливать способы глаголов в GraphQL. Ключевые слова, такие как Запрос или Мутация решит, что будет выполняться запрос.
  • Маршруты API отдыха обычно обрабатываются одним обработчиком маршрута. В GraphQL вы можете иметь один запрос триггера из нескольких мутаций и получить соединение отклика от нескольких источников.

Запрашивает

А Запрос это метод GraphQL, который позволяет нам Получить данные из нашего API. Несмотря на то, что он может принимать параметры для фильтрации, заказа или просто поиска конкретного документа, который запрос не может мутировать эти данные.

Мутации

Мутации Все, что есть не Что бы означало бы глагол получить глагол в обычных API. Обновление, создание или удаление данных из нашего API сделано через мутации

Подписки

При использовании веб-розетка подписка относится к соединению между клиентом и сервером.

Сервер постоянно наблюдает за мутациями или запросами, которые прикреплены к определенной подписке и сообщают о любых изменениях клиента в режиме реального времени. Подписки в основном используются для виджетов/приложений в реальном времени.

Типы и входы

Чтобы убедиться, что наши запросы и мутации могут обработать данные для запроса базы данных, Типы Работайте как модель ORM для баз данных. Установка Типы Вверхм мы можем определить тип переменной нашей резольветеры вернутся.

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

Например, мы определим пару Типы и входы :

type User {
  id: ID
  name: String!
  age: Int!
  address: Address
  followers: [ID]
}

type Address {
  street: String
  city: String
  country: String
}

input UserInput {
  name: String!
  age: Int!
}

type Query {
  getAllUsers: [User]
}

type Mutation {
  createUser(user: UserInput!): ID
}

Свойства могут иметь пользовательский тип в качестве своего типа, кроме примитивных, таких как:

  • Нить
  • Int.
  • Плавать
  • Логический
  • Я БЫ

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

Кроме того, обязательный статус свойства может быть установлен с ! , что означает, что собственность должна присутствовать.

Резольвенторы

Это действия, которые выполняются при вызове запросов и мутаций.

GetAllusers и Createuser Будут подключены к Resolver, который выполнит фактические расчеты и вопросы базы данных.

Создание нашего проекта

Для этого учебника мы будем создавать проект Vue.js, используя Vue CLI 3.0 , который будет загрузовать проект с структурой папки, которая выглядит так:

Если вам нужна помощь в настройке проекта, вы можете посмотреть на этот учебник для интерфейса командной строки.

Мы можем начать служить наше приложение с помощью команды:

$ npm run serve

Apollo Client

Apollo Client Приносит инструмент на передний разработок, чтобы облегчить запросы/мутации GraphQL. Он действует как клиент HTTP, который подключается к API GraphQL и предоставляет кэширование, обработку ошибок и даже возможности управления государством.

Для этого учебника Vue-Apollo Будет использоваться, что является интеграцией Apollo, специально разработанная для Vue.js.

Конфигурация APOLLO

Чтобы начать нашу конфигурацию APOLLO, необходимо будет установить несколько пакетов:

$ npm install apollo-client apollo-link-http apollo-cache-inmemory vue-apollo graphql graphql-tag

Внутри /graphql Папка в нашем проекте, мы создадим APOLLO.JS :

// apollo.js

import Vue from 'vue'
import { ApolloClient } from 'apollo-client'
import { HttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
import VueApollo from 'vue-apollo'

const httpLink = new HttpLink({
    uri: process.env.VUE_APP_GRAPHQL_ENDPOINT
})

// Create the apollo client
export const apolloClient = new ApolloClient({
    link: httpLink,
    cache: new InMemoryCache(),
    connectToDevTools: true
})

// Install the Vue plugin

Vue.use(VueApollo)

export const apolloProvider = new VueApollo({
    defaultClient: apolloClient
})

Httplink это объект, который требует Uri Свойство, которое относится к конечной точке GraphQL из используемого API. Ex: localhost: 8081/graphql

Тогда новый Apolloclient Следует создавать экземпляр, где можно установить ссылку, экземпляр кэша и дополнительные параметры.

Наконец, мы обертываем наши Apolloclient внутри VueAppollo Экземпляр, чтобы мы могли использовать его крючки внутри наших компонентов Vue.

Глобальная обработка ошибок

Существует способ обработки ошибок во всем мире внутри файла конфигурации. Для этого нам нужно установить пакет NPM под названием Apollo-Link-Error , который проверяет и управляет ошибками из сети:

// apollo.js

import Vue from 'vue'
import { ApolloClient } from 'apollo-client'
import { HttpLink } from 'apollo-link-http'
import { onError } from "apollo-link-error"
import { InMemoryCache } from 'apollo-cache-inmemory'
import VueApollo from 'vue-apollo'

const httpLink = new HttpLink({
    uri: process.env.VUE_APP_GRAPHQL_ENDPOINT
})

// Error Handling
const errorLink = onError(({ graphQLErrors, networkError }) => {
    if (graphQLErrors)
        graphQLErrors.map(({ message, locations, path }) =>
            console.log(
                `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
            )
        )
    if (networkError) console.log(`[Network error]: ${networkError}`)
})

// Create the apollo client
export const apolloClient = new ApolloClient({
    link: errorLink.concat(httpLink),
    cache: new InMemoryCache(),
    connectToDevTools: true
})

// Install the Vue plugin
Vue.use(VueApollo)

export const apolloProvider = new VueApollo({
    defaultClient: apolloClient
})

После импорта OneRor Функция из пакета, мы можем реализовать его как своего рода промежуточное программное обеспечение клиента APOLLO. Это поймает какие-либо сетевые или графические ошибки, что дает нам возможность управлять им во всем мире.

Обратный вызов вызывается объектом с некоторыми свойствами, когда произошла ошибка:

  • Операция : Операция, которая вызвала обратный вызов, потому что была найдена ошибка.
  • ответ : Результат операции.
  • GraphQLErrors : Массив ошибок с конечной точки графики
  • NetworkError : Любая ошибка во время выполнения операции или ошибки сервера.
  • вперед : Следующая ссылка, на которую ссылаются в цепочку.

Управление государством с клиентом Apollo

Другая альтернатива использования Vuex С Vue Projects, а также при использовании клиента APOLLO – использовать пакет под названием Apollo-Link-State Отказ

Он работает как локальный инструмент управления данными, который работает так, как если бы вы запросили сервер, но он делает это локально.

Кроме того, это отличный способ управлять кэшем для нашего приложения, что делает клиента Apollo HTTP-клиента и инструмент управления состоянием/кэшем.

Для получения дополнительной информации вы можете проверить официальную документацию для Apollo-Link-State Отказ

Создание запросов

Для создания запросов нам нужно настроить тег строки с пакетом graphql-tag Отказ Для сохранения аккуратного и структурированного проекта мы создадим папку под названием Запросы Внутри папки GraphQL.

Предполагая, что сервер, получающий запрос, настроен правильно для интерпретации этого запроса, например, мы можем вызвать Resolver под названием GetAllusers :

import gql from 'graphql-tag'

export const GET_ALL_USERS_QUERY = gql`
  query getAllUsers {
    getAllUsers {
      // Fields to retrieve
      name
      age
    }
  }
`

Работа по умолчанию в GraphQL является Запрос Так что Запрос ключевое слово необязательно.

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

Используя мутации

Подобно запросам, мы также можем использовать мутации, создавая GQL-строка Отказ

import gql from 'graphql-tag'

export const CREATE_USER_MUTATION = gql`
  mutation createUser($user: UserInput!) {
    createUser(user: $user)
  }
`

Наше Createuser Мутация ожидает UserInput ввод, и, чтобы иметь возможность использовать параметры, переданные APOLLO. Сначала мы определим переменную с $ называется Пользователь Отказ Затем внешняя обертка передаст переменную к Createuser Мутация, как и ожидалось сервером.

Фрагменты

Для того, чтобы сохранить наши GQL-Type Строки, аккуратные и читаемые, мы можем использовать фрагменты повторно использовать запрос логики.

fragment UserFragment on User {
  name: String!
  age: Int!
}

query getAllUsers {
  getAllUsers {
    ...UserFragment
  }
}

Использование GraphQL в Vue компонентах

Внутри main.js Файл, чтобы настроить клиента APOLLO, нам нужно импортировать и прикрепить клиента к нашему экземпляру.

// main.js
import Vue from 'vue'
import { apolloProvider } from './graphql/apollo'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
    el: '#app',
    apolloProvider,
    render: h => h(App)
})

Так как мы добавили наши Аполлопровидер к экземпляру VUE, мы можем получить доступ к клиенту через $ Аполлон ключевое слово:

// GraphQLTest.vue



Если мы хотим создать пользователя, мы можем использовать Мутация :

// GraphQLTest.vue



Использование этого подхода позволяет использовать нам микро-управление, когда и где будут выполняться наши мутации и запросы. Теперь мы увидим некоторые другие способы обработки этих методов, что Vue Apollo дает нам.

Объект Аполлона

Внутри наших компонентов Vue мы получаем доступ к Аполлон Объект, который можно использовать для легко управлять нашими запросами и подпискими:




Пояснение запросов

При определении запроса внутри объекта Apollo можно для региту Этот запрос при вызове мутации или другого запроса с региту Метод или Регистрация имущество:




Используя Аполлон Объект, предоставленный нам Vue-Apollo , нам больше не нужно активно использовать способ клиента APOLLO для запуска запросов/подписок/подписок, а некоторые полезные свойства и параметры становятся доступными для нас.

Свойства объекта Apollo
  • Запрос : Это GQL Введите строку, относящуюся к запросу, которое хочет получить срабатывание.
  • Переменные : Объект, который принимает параметры, передаваемые в данный запрос.
  • FetchPolicy : Имущество, которое устанавливает способ запроса будет взаимодействовать с кешем. Варианты кэш-и-сеть , только сеть , кэш-только , Нет кэш , В режиме ожидания и по умолчанию это кэш-первый Отказ
  • Поллинтервал : Время в миллисекундах, которые определяют, как часто запрос автоматически запускает.
Специальные варианты
  • $ Error . Чтобы поймать ошибки в заданном обработчике.
  • $ Глубоко Наблюдает глубоко для изменений в запросе.
  • $ Skip : Отключает все запросы и подписки в данном компоненте.
  • $ Skipallqueries : Отключает все запросы от компонента.
  • $ Skipallsubsctions : Чтобы отключить все подписки в компоненте.

Компоненты Apollo

Вдохновленный к тому, как клиент Apollo реализован для Реагировать ( React-Apollo ), Vue-Apollo предоставляет нам несколько компонентов, которые мы можем использовать из коробки для управления пользовательским интерфейсом и состоянием наших запросов и мутаций с VUE-компонентом внутри шаблона.

Apolloquery

Проще способ управлять нашими запросами в более интуитивно понятном порядке:


    

Аполломатация

Очень похоже на пример выше, но мы должны вызвать мутацию с Мутате Функция звонка:


    

Заключение

GraphQL приносит много гибкости для разработки API, от производительности, простоты использования и общей разной точки зрения того, что должен выглядеть API и ведут себя как. Кроме того, Apolloclient и Vue Apollo доставляет набор инструментов для лучшего управления нашим интерфейсом UI, состояние и операции, даже обработку ошибок и кэш!

Для получения дополнительной информации о клиенте GraphQL и APOLLO вы можете посетить следующее: