Перейти к основному содержимому

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 (создание, чтение, обновление, удаление).

Step01

Подключаем плагин API

amplify add api

AWSAmplify

Step02

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

amplifyMockApi

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

Три кита на которых стоит GraphQL:

Query (READ)

Проще говоря, запросы (queries) в GraphQL — это то, как вы собираетесь запрашивать данные. Вы получите именно те данные, которые вам нужны. Не больше, не меньше.

Mutation (CREATE UPDATE DELETE)

Мутации в GraphQL — это способ изменения данных на сервере и получения обновленных данных обратно.

Subscriptions

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

Посмотреть все доступные методы нашегоо созданоого API можно нажав на Docs (Documentation Explorer) в правом верхнем углу. Значения нажимаемые, таким образом можно посмотреть все возможные запросы.

Docs

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
}
}

create

Для закрепления материала, создайте еще некоторое количество вакансий.

READ

Получаем список всех вакансий. Вставляем запрос:

query Read {
__typename
listJobs {
items {
description
id
owner
position
rate
}
}
}

read

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
}
}

update

DELETE

Для удаления нам также как и в случае с обновлением нужно передать ID вакансии (обязательно введите свой, а не из примера).

mutation Delete {
__typename
deleteJob(input: { id: "1a8a763f-28b8-450a-96f0-73e0d1d8ac04" }) {
id
}
}

delete

Разрешения

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

 @auth( rules: [ {allow: owner, ownerField: “owner”, operations: [create, update, delete]}, ])

Чтобы сменить пользователя нажимаем на UpdateAuth в главном меню. Где произвольно обновляем Username и Email.

UpdateAuth

authOptions

Если отправим запрос READ, то он работает, но если мы отправим запрос UPDATE или DELETE и получаем ошибку. Правила работают, что и требовалось доказать!

Теперь когда мы протестировали работоспособность API можно опубликовать его в облако командой:

amplify push

Через несколько минут модель загружена на сервера AWS, поэтому далее мы переходим к приложению react native.

EnglishMoji!