本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:HTTP 解析程序
Amazon使您可以使用支持的数据源(即,Amazon Lambda、Amazon DynamoDB、Amazon OpenSearch 服务或 Amazon Aurora)执行各种操作,以及任意 HTTP 终端节点来解析 GraphQL 字段。在您的 HTTP 终端节点可用后,您可以使用数据源连接它们。然后,您可以在架构中配置一个解析程序以执行 GraphQL 操作(如查询、更改和订阅)。本教程将引导您了解一些常见示例。
在本教程中,您将使用 REST API(使用 Amazon API Gateway 和 Lambda 创建)以及AmazonAppSync GraphQL 终端节点。
一键设置
如果你想在中自动设置 GraphQL 终端节点Amazon配置了 HTTP 终端节点的 AppSync(使用 Amazon API Gateway 和 Lambda),您可以使用以下命令:Amazon CloudFormation模板:
创建 REST API
您可以使用以下 Amazon CloudFormation 模板来设置适用于本教程的 REST 终端节点:
Amazon CloudFormation 堆栈将执行以下步骤:
-
设置 Lambda 函数,其中包含您的微服务的业务逻辑。
-
使用以下终端节点/方法/内容类型组合设置 API Gateway REST API:
API 资源路径 | HTTP 方法 | 支持的内容类型 |
---|---|---|
/v1/users |
POST |
application/xml |
/v1/users/1 |
GET |
application/json |
/v1/users/1 |
PUT |
application/json |
/v1/users/1 |
DELETE |
application/json |
创建您的 GraphQL API
要在中创建 GraphQL APIAmazonAppSync:
-
打开AmazonAppSync 控制台然后选择创建 API.
-
对于 API 名称,请键入
UserData
。 -
选择自定义架构。
-
选择创建。
这些区域有:AmazonAppSync 控制台会使用 API 密钥身份验证模式为您创建新的 GraphQL API。您可以根据本教程后面的说明,使用控制台设置 GraphQL API 的其余部分,并针对它运行查询。
创建 GraphQL 架构
现在,您有一个 GraphQL API,让我们创建一个 GraphQL 架构。从中的模式编辑器AmazonAppSync 控制台,确保您的架构与以下架构匹配:
schema { query: Query mutation: Mutation } type Mutation { addUser(userInput: UserInput!): User deleteUser(id: ID!): User } type Query { getUser(id: ID): User } type User { id: ID! username: String! firstname: String lastname: String phone: String email: String } input UserInput { id: ID! username: String! firstname: String lastname: String phone: String email: String }
配置 HTTP 数据源
要配置 HTTP 数据源,请执行以下操作:
-
在 DataSources (数据源) 选项卡上,选择 New (新建),然后为数据源键入一个友好名称(例如,
HTTP
)。 -
在 Data source type (数据源类型) 中,选择 HTTP。
-
将终端节点设置为创建的 API Gateway 终端节点。确保不将阶段名称作为终端节点的一部分包含在内。
注意:目前仅支持公共终端节点AmazonAppSync。
注意:有关已由AmazonAppSync 服务,请参阅认可的证书颁发机构 (CA)Amazon AppSync对于 HTTPS 终端节点.
配置解析程序
在此步骤中,您将 HTTP 数据源连接到 getUser 查询。
设置解析程序:
-
选择 Schema (架构) 选项卡。
-
在数据类型窗格位于右下查询键入,找到GetUser字段然后选择Attach.
-
在 Data source name (数据源名称) 中,选择 HTTP。
-
在 Configure the request mapping template (配置请求映射模板) 中,粘贴以下代码:
{ "version": "2018-05-29", "method": "GET", "params": { "headers": { "Content-Type": "application/json" } }, "resourcePath": $util.toJson("/v1/users/${ctx.args.id}") }
-
在 Configure the response mapping template (配置响应映射模板) 中,粘贴以下代码:
## return the body #if($ctx.result.statusCode == 200) ##if response is 200 $ctx.result.body #else ##if response is not 200, append the response to error block. $utils.appendError($ctx.result.body, "$ctx.result.statusCode") #end
-
选择 Query (查询) 选项卡,然后运行以下查询:
query{ getUser(id:1){ firstname username } }
此查询应返回以下响应:
{ "data": { "getUser": { "id": "1", "username": "nadia" } } }
-
选择 Schema (架构) 选项卡。
-
在数据类型窗格在右下突变,查找AddUser字段然后选择Attach.
-
在 Data source name (数据源名称) 中,选择 HTTP。
-
在 Configure the request mapping template (配置请求映射模板) 中,粘贴以下代码:
#set($xml = "<User>") #foreach ($mapEntry in $ctx.args.userInput.entrySet()) #set($xml = "$xml<$mapEntry.key>$mapEntry.value</$mapEntry.key>") #end #set($xml = "$xml</User>") { "version": "2018-05-29", "method": "POST", "params": { "headers":{ "Content-Type":"application/xml" }, "body":"$xml" }, "resourcePath": "/v1/users" }
-
在 Configure the response mapping template (配置响应映射模板) 中,粘贴以下代码:
## return the body #if($ctx.result.statusCode == 200) ##if response is 200 ## Because the response is of type XML, we are going to convert ## the result body as a map and only get the User object. $utils.toJson($utils.xml.toMap($ctx.result.body).User) #else ##if response is not 200, append the response to error block. $utils.appendError($ctx.result.body, "$ctx.result.statusCode") #end
-
选择 Query (查询) 选项卡,然后运行以下查询:
mutation{ addUser(userInput:{ id:"2", username:"shaggy" }){ id username } }
此查询应返回以下响应:
{ "data": { "getUser": { "id": "2", "username": "shaggy" } } }
调用Amazon服务
您可以使用 HTTP 解析程序为设置 GraphQL API 接口Amazon服务。发送 HTTP 请求Amazon必须使用签名版本 4 流程以便Amazon可以识别谁发送了他们。Amazon当您将 IAM 角色与 HTTP 数据源相关联时,AppSync 会代表您计算签名。
您提供两个其他组件来调用Amazon使用 HTTP 解析器的服务:
-
具有调用Amazon服务 API
-
数据源中的签名配置
例如,如果您希望调用LListGraphqlApis使用 HTTP 解析器,你先创建 IAM 角色那个AmazonAppSync 假设附加了以下策略:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "appsync:ListGraphqlApis" ], "Effect": "Allow", "Resource": "*" } ] }
接下来,为创建 HTTP 数据源AmazonAppSync。在本示例中,您会调用Amazon美国西部(俄勒冈)区域的 AppSync。在名为 http.json
文件中设置以下 HTTP 配置,其中包括签名区域和服务名称:
{ "endpoint": "https://appsync.us-west-2.amazonaws.com/", "authorizationConfig": { "authorizationType": "AWS_IAM", "awsIamConfig": { "signingRegion": "us-west-2", "signingServiceName": "appsync" } } }
然后,使用Amazon CLI以便创建具有关联角色的数据源,如下所示:
aws appsync create-data-source --api-id <API-ID> \ --name AWSAppSync \ --type HTTP \ --http-config file:///http.json \ --service-role-arn <ROLE-ARN>
当您将解析程序附加到架构中的字段时,使用以下请求映射模板调用:AmazonAppSync:
{ "version": "2018-05-29", "method": "GET", "resourcePath": "/v1/apis" }
当您为此数据源运行 GraphQL 查询时,AmazonAppSync 会使用您提供的角色对请求进行签名,并在请求中包含签名。该查询会返回一组Amazon在您的账户中,AppSync GraphQL APIAmazon区域。