尝试使用AppSync来了解GraphQL
简而言之
我根据AppSync的快速入门创建了一个样例模式,以下是我的笔记:
https://docs.aws.amazon.com/zh_cn/appsync/latest/devguide/quickstart-launch-a-sample-schema.html
GraphQL是一种查询语言。
日本語でトップにある公式の翻訳
GraphQL是一种API查询语言,也是一个用于运行这些查询的运行时。GraphQL能够提供API内数据的清晰易懂的描述,并使客户端能够精确地请求所需的内容,从而使API能够随着时间的推移进行演进,并启用强大的开发者工具。
-
- 公式:https://graphql.org/
参考:https://eh-career.com/engineerhub/entry/2018/12/26/103000
AppSync 是什么?
-
- awsが提供する完全マネージメント型のGraphQL サービスのこと
- 公式ドキュメント:https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/welcome.html
我试试做快速入门。
- https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/quickstart-launch-a-sample-schema.html
按照上述的步骤,创建事件应用程序的示例架构后,会创建新的模式定义以及作为数据源的DynamoDB表。以下是模式定义的部分摘录。
type Event {
id: ID!
name: String
where: String
when: String
description: String
# Paginate through all comments belonging to an individual post.
comments(limit: Int = 10, nextToken: String): CommentConnection
}
type Mutation {
# Create a single event.
createEvent(
name: String!,
when: String!,
where: String!,
description: String!
): Event
# Delete a single event by id.
deleteEvent(id: ID!): Event
# Comment on an event.
commentOnEvent(eventId: ID!, content: String!, createdAt: String!): Comment
}
type Query {
# Get a single event by id.
getEvent(id: ID!): Event
# Paginate through events.
listEvents(filter: TableEventFilterInput, limit: Int = 10, nextToken: String): EventConnection
}
type Subscription {
subscribeToEventComments(eventId: String!): Comment
@aws_subscribe(mutations: ["commentOnEvent"])
}
schema {
query: Query
mutation: Mutation
subscription: Subscription
}
模式
- ルート型と呼ばれるもの
schema {
query: Query
mutation: Mutation
subscription: Subscription
}
查询
- GraphQLにおける、データ取得を行う仕組み。
type Query {
# Get a single event by id.
getEvent(id: ID!): Event
# Paginate through events.
listEvents(filter: TableEventFilterInput, limit: Int = 10, nextToken: String): EventConnection
}
突变 (tū
- GraphQLにおける、データを更新する仕組み。登録、更新、削除処理等を行う
type Mutation {
# Create a single event.
createEvent(
name: String!,
when: String!,
where: String!,
description: String!
): Event
# Delete a single event by id.
deleteEvent(id: ID!): Event
# Comment on an event.
commentOnEvent(eventId: ID!, content: String!, createdAt: String!): Comment
}
订阅
请参考以下链接查看相关内容:
https://qiita.com/yoshii0110/items/fbee34d5c235a2a064f9
https://qiita.com/yoshii0110/items/3d9ec03215537646b65c
可以通过Mutation来触发基于事件的处理。
Mutation指的是GraphQL中的事务处理(Put/Post/Delete)。
因此,当客户端在GraphQL服务器上执行Put/Post/Delete时,如果有订阅该操作的客户端,可以向该客户端推送已执行操作的数据。
type Subscription {
subscribeToEventComments(eventId: String!): Comment
@aws_subscribe(mutations: ["commentOnEvent"])
}
数据源
数据源是用户账户中 AWS 资源上可由 AWS AppSync 代为访问的部分。
- DynamoDB、RDS(Aurora Serverless)、Elasticsearch、Lambda、HTTPエンドポイント等を指定することが可能
解决者
解析器是将GraphQL请求转换为数据源可以理解的格式的函数。解析器具有访问上下文对象的能力,并定义了请求和响应模板的转换和执行逻辑。
-
- データソース同様に、DynamoDB、RDS(Aurora Serverless)、Elasticsearch、Lambda、HTTPエンドポイント等を指定することが可能
-
- ドキュメント:https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/resolver-mapping-template-reference.html
- Queryおよび、Mutationにはリゾルバーと呼ばれるものがアタッチされており、リゾルバーを介してデーターソース(今回はDynamodb)からデータの取得や、登録、削除を行うことが可能。AWSコンソール上のResolversから確認ができ、リゾルバーの中身は以下のようになっている。
突变:对于CreateEvent的解析器
数据源名称:AppSyncEventTable
{
"version": "2017-02-28",
"operation": "PutItem",
"key": {
"id": { "S": "$util.autoId()"}
},
"attributeValues": {
"name": { "S": "$context.arguments.name" },
"where": { "S": "$context.arguments.where" },
"when": { "S": "$context.arguments.when" },
"description": { "S": "$context.arguments.description" }
}
}
$util.toJson($context.result)
查询:对于getEvents的解析器
数据源名称:AppSyncEventTable
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": { "S": "$context.arguments.id" }
}
}
$util.toJson($context.result)
执行Mutation和Query
-
- https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/quickstart-write-queries.html
-
- AWSコンソールの「クエリ」から、クエリを実行することが可能。クエリのリクエストおよびレスポンスのフォールドを選択することが可能。
Mutationの実行
実行すると、DynamoDBへデータが登録される
mutation add {
createEvent(
name:"My First Event"
where:"Today"
when:"My House"
description:"Very first event"
){
id
name
where
when
description
}
}
- queryの実行
query get {
getEvent(id:"XXXXXX-XXXX-XXXXXXX-XXXX-XXXXXXXXX"){
name
where
when
description
}
}
{
"data": {
"getEvent": {
"id": "db9ac484-1424-4c07-b470-d7238efad04b",
"name": "My First Event",
"when": "Today",
"where": "My House",
"description": "Very first event"
}
}
}
- curl でのquery実行も可能
$ curl -X POST -H "Content-Type:application/graphql" -H "x-api-key:[APIキー]" -d '{ "query": "query { getEvent(id: \"[EventTableのID]\") { name } }" }' [APIURL]
附言
暫時觸碰一下,但還無法完全掌握整體情況,所以會繼續研究關於REST的詳細比較和優缺點等。
我还想阅读其他的东西。
-
- https://note.com/konpyu/n/nc4fd122644a1
-
- https://circleci.com/ja/blog/introduction-to-graphql/
-
- https://qiita.com/NagaokaKenichi/items/a4991eee26e2f988c6ec
-
- https://www.webprofessional.jp/rest-2-0-graphql/
-
- https://wawoon.dev/posts/tips-of-graphql-schema-design
-
- https://qiita.com/hitochan777/items/04c16ca770f7b3a84af5
-
- https://qiita.com/hitochan777/items/450ae5a1ff821a217179
-
- https://eh-career.com/engineerhub/entry/2018/12/26/103000
- https://bitjourney.kibe.la/shared/entries/1f26acbe-315f-42b8-9ecd-11bcaac5b697