Amplify API - AppSync - CRUD (Create Read Update Delete)
AWS AppSync упрощает разработку приложений, позволяя создать универсальный API для безопасного доступа к данным, их изменения и объединения данных из нескольких источников. AppSync представляет собой управляемый сервис, который использует GraphQL, чтобы приложения могли без труда получать только необходимые им данные.
С помощью AppSync можно создавать масштабируемые приложения, в том числе требующие обновлений в режиме реального времени, с использованием целого ряда источников данных, таких как хранилища данных NoSQL, реляционные базы данных, API HTTP и собственные источники данных с AWS Lambda. Для мобильных и веб‑приложений AppSync также предоставляет доступ к локальным данным, когда устройства переходят в автономный режим, и синхронизирует данные при повторном подключении к Интернету. При этом клиент может настроить порядок разрешения конфликтов.
Преимущества:
Легкое начало и развитие в ногу с бизнесом
Начните работу за считанные минуты с помощью выбранного IDE (например, Xcode, Android Studio, VS Code), а также используйте интуитивно понятную консоль управления AWS AppSync или AWS Amplify CLI для автоматического создания вашего API и клиентского кода. AWS AppSync интегрируется с Amazon DynamoDB, Amazon Aurora, Amazon Elasticsearch, AWS Lambda и другими сервисами AWS, позволяя вам создавать сложные приложения с практически неограниченными производительностью и памятью, которые изменяются в зависимости от бизнес-потребностей.
Подписки в реальном времени и офлайн-доступ
AWS AppSync обеспечивает оформление подписок в реальном времени на миллионах устройств, а также офлайн-доступ к данным приложения. После повторного подключения устройства AWS AppSync синхронизирует только обновления на момент отключения устройства, а не всю базу данных. AWS AppSync предлагает определять и разрешать конфликты на стороне сервера с возможностью пользовательской настройки.
Унифицированный и защищенный доступ к распределенным данным
Выполняйте сложные запросы и обобщения по нескольким источникам данных с помощью одного сетевого вызова с использованием GraphQL. AWS AppSync позволяет легко защитить данные вашего приложения, используя одновременно несколько режимов аутентификации, а также позволяет определять степень угрозы и выполнять детальный контроль доступа на уровне определения данных непосредственно из вашей схемы GraphQL.
В этом уроке мы будем создавать API-интерфейс GraphQL, который взаимодействует с базой данных DynamoDB NoSQL для выполнения операций CRUD (создание, чтение, обновление, удаление).
Подключаем плагин API
amplify add api
schema.graphql
После выбраных пунктов откроется схема GraphQL в amplify/backend/api/<datasourcename>/schema.graphql
куда вставляем эту модель:
type Job @model @auth(rules: [{ allow: owner, ownerField: "owner", operations: [create, update, delete] }]) {
id: ID!
position: String!
rate: String!
description: String!
owner: String
}
Это GraphQL схема. GraphQL Transform предоставляет простую в использовании абстракцию, которая помогает быстро создавать серверные части для веб-приложений и мобильных приложений в AWS. С помощью GraphQL Transform вы определяете модель данных вашего приложения, используя язык определения схемы GraphQL (SDL), а библиотека обрабатывает преобразование определения SDL в набор полностью описательных шаблонов AWS CloudFormation, которые реализуют вашу модель данных.
При использовании вместе с такими инструментами, как Amplify CLI, GraphQL Transform упрощает процесс разработки, развертывания и поддержки API-интерфейсов GraphQL. С его помощью вы определяете свой API с помощью языка определения схемы GraphQL (SDL) и затем можете использовать автоматизацию для преобразования его в полностью описательный шаблон облачной информации, который реализует спецификацию. GraphQL — это спецификация API. Это язык запросов для API и среда выполнения для выполнения этих запросов с вашими данными. Он имеет некоторые сходства с REST и является лучшей заменой REST.
GraphQL был представлен Facebook в 2015 году, хотя он использовался внутри компании с 2012 года. GraphQL позволяет клиентам определять структуру требуемых данных, и именно эта структура возвращается с сервера. Запрос данных таким способом обеспечивает гораздо более эффективный способ взаимодействия приложений на стороне клиента с API-интерфейсами, уменьшая количество неполных выборок и предотвращая избыточные выборки данных.
Подробней о GraphQL здесь
Вернемся к нашей схеме, где основными компонентами схемы GraphQL являются типы объектов, представляющий из себя тип объекта, который вы можете извлечь из вашего сервиса:
Job
— это тип объекта GraphQL(GraphQL Object Type), то есть тип с некоторыми полями. Большинство типов в вашей схеме будут объектными типами.id position rate description owner
— поля в типе Job. Это означает, что это единственные поля, которые могут появляться в любой части запроса GraphQL, работающего с типом Job.String
— это один из встроенных скалярных типов — это типы, которые разрешаются в один скалярный объект и не могут иметь подвыборов в запросе. Мы рассмотрим скалярные типы позже.String!
— поле не имеет значения NULL, означает, что служба GraphQL обещает всегда давать вам значение при запросе этого поля. Вообщем это обязательное поле.
Типы
GraphQL поставляется с набором скалярных типов по умолчанию из коробки:
Int
32-разрядное целое число со знаком.Float
значение с плавающей запятой с двойной точностью.String
последовательность символов UTF ‐ 8.Boolean
true или false.ID
скалярный тип ID представляет собой уникальный идентификатор, часто используемый для повторного получения объекта или в качестве ключа для кэша. Тип идентификатора сериализуется так же, как и строка; однако определение его как идентификатора означает, что он не предназначен для восприятия человеком.
Директивы
@model
— Типы объектов, помеченные@model
, являются объектами верхнего уровня в сгенерированном API. Объекты, помеченные@model
, хранятся в Amazon DynamoDB и могут быть защищены с помощью@auth
, связаны с другими объектами через@connection
@auth
— Для взаимодействия приложений с вашим API GraphQL требуется авторизация. Ключи API лучше всего использовать для общедоступных API. Типы объектов@auth
, аннотированные@auth
, защищены набором правил авторизации, которые предоставляют вам дополнительные элементы управления, чем авторизация верхнего уровня в API. Вы можете использовать директиву@auth
для определений типов объектов и полей в схеме вашего проекта. При использовании директивы@auth
для определений типов объектов, которые также аннотируются@model
, все средства распознавания, которые возвращают объекты этого типа, будут защищены.
Другие директивы и подробности в официальной документации.
Правила директивы @auth
@auth( rules: [ {allow: owner, ownerField: "owner", operations: [create, update, delete]} ])
означают, что операции CREATE, UPDATE, DELETE разрешены исключительно владельцу, а операция READ всем.
Пришло время проверить это на деле! Поэтому пишем команду в консоле:
amplify mock api
С этой командой вы можете быстро протестировать свои наработки изменения без необходимости выделять или обновлять облачные ресурсы, которые вы используете на каждом этапе. Таким образом, вы можете настроить модульные и интеграционные тесты, которые могут выполняться быстро, не затрагивая ваш облачный бэкэнд.
Три кита на которых стоит GraphQL:
Query (READ)
Проще говоря, запросы (queries) в GraphQL — это то, как вы собираетесь запрашивать данные. Вы получите именно те данные, которые вам нужны. Не больше, не меньше.
Mutation (CREATE UPDATE DELETE)
Мутации в GraphQL — это способ изменения данных на сервере и получения обновленных данных обратно.
Subscriptions
Cпособ поддерживать соединение с сервером в режиме реального времени. Это означает, что всякий раз, когда событие происходит на сервере и когда это событие вызывается, сервер будет отправлять соответствующие данные клиенту.
Посмотреть все доступные методы нашегоо созданоого API можно нажав на Docs (Documentation Explorer) в правом верхнем углу. Значения нажимаемые, таким образом можно посмотреть все возможные запросы.
CREATE
Открываем наш API по адресу, что выдал(у каждого свой) результат команды amplify mock api
и выполняем запрос CREATE нажимая кнопку плей.
mutation Create {
__typename
createJob(
input: {
position: "React Native Developer"
rate: 3000
description: "We are looking for a React Native developer (St. Petersburg) to develop from scratch a mobile version of the main cs.money platform Our product is an international trading platform for the exchange of virtual items. (CS: GO, Dota 2) which is shared by more than 5 million users. The project has existed for more than 3 years. and takes a leading position in its field. The platform is used in more than 100 countries of the world. Now we want to make a mobile application and decided to do it on React Native. You have to develop an application from scratch and this is a great opportunity to build a good architecture without resting on legacy. Requirements: Knowledge of react patterns Knowledge of SOLID principles Knowledge of the basics of mobile specifics (caching, working with the native API, rendering optimization) Knowledge of RN"
}
) {
description
id
owner
position
rate
}
}
Для закрепления материала, создайте еще некоторое количество вакансий.
READ
Получаем список всех вакансий. Вставляем запрос:
query Read {
__typename
listJobs {
items {
description
id
owner
position
rate
}
}
}
UPDATE
Для обновления нам необходимо взять ID вакансии (обязательно введите свой, а не из примера) и передать его в этот запрос с изменеными данными. Например обновим поля position
и rate
mutation Update {
__typename
updateJob(input: { id: "1a8a763f-28b8-450a-96f0-73e0d1d8ac04", position: "Full Stack Serverless", rate: 5000 }) {
id
description
owner
position
rate
}
}
DELETE
Для удаления нам также как и в случае с обновлением нужно передать ID вакансии (обязательно введите свой, а не из примера).
mutation Delete {
__typename
deleteJob(input: { id: "1a8a763f-28b8-450a-96f0-73e0d1d8ac04" }) {
id
}
}
Разрешения
Теперь проверим работают ли наши правила, что мы указали в схеме. Обновлять, удалять и создавать может только владелец.
@auth( rules: [ {allow: owner, ownerField: “owner”, operations: [create, update, delete]}, ])
Чтобы сменить пользователя нажимаем на UpdateAuth в главном меню. Где произвольно обновляем Username и Email.
Если отправим запрос READ, то он работает, но если мы отправим запрос UPDATE или DELETE и получаем ошибку. Правила работают, что и требовалось доказать!
Теперь когда мы протестировали работоспособность API можно опубликовать его в облако командой:
amplify push
Через несколько минут модель загружена на сервера AWS, поэтому далее мы переходим к приложению react native.