

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在中使用 HTTP 解析器 AWS AppSync
<a name="tutorial-http-resolvers-js"></a>

AWS AppSync 允许您使用支持的数据源（即亚马逊 DynamoDB AWS Lambda、 OpenSearch 亚马逊服务或 Amazon Aurora）执行各种操作，此外还可以使用任何任意 HTTP 终端节点来解析 GraphQL 字段。在您的 HTTP 终端节点可用后，您可以使用数据来源连接它们。然后，您可以在架构中配置一个解析器以执行 GraphQL 操作（如查询、变更和订阅）。本教程将引导您了解一些常见示例。

在本教程中，您将使用 REST API（使用 Amazon API Gateway 和 Lambda 创建）和 GraphQL AWS AppSync 终端节点。

## 创建 REST API
<a name="creating-a-rest-api"></a>

您可以使用以下 AWS CloudFormation 模板来设置适用于本教程的 REST 端点：

[https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/http/http-api-gw.yaml](https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/http/http-api-gw.yaml)

 AWS CloudFormation 堆栈执行以下步骤：

1. 设置 Lambda 函数，其中包含您的微服务的业务逻辑。

1. 使用以下endpoint/method/content类型组合设置 API Gateway REST API：


****  

| API 资源路径 | HTTP 方法 | 支持的内容类型 | 
| --- | --- | --- | 
|  /v1/users  |  POST  |  application/json  | 
|  /v1/users  |  GET  |  application/json  | 
|  /v1/users/1  |  GET  |  application/json  | 
|  /v1/users/1  |  PUT  |  application/json  | 
|  /v1/users/1  |  DELETE  |  application/json  | 

## 创建您的 GraphQL API
<a name="creating-your-graphql-api"></a>

要在以下位置创建 GraphQL API，请执行以下操作： AWS AppSync

1. 打开 AWS AppSync 控制台并选择**创建 API**。

1. 选择 **GraphQL APIs**，然后选择 “**从头开始设计**”。选择**下一步**。

1. 对于 API 名称，请键入 `UserData`。选择**下一步**。

1. 选择 `Create GraphQL resources later`。选择**下一步**。

1. 检查您的输入，然后选择**创建 API**。

 AWS AppSync 控制台使用 API 密钥身份验证模式为您创建一个新的 GraphQL API。您可以使用控制台进一步配置 GraphQL API 并运行请求。

## 创建 GraphQL 架构
<a name="creating-a-graphql-schema"></a>

现在，您有一个 GraphQL API，让我们创建一个 GraphQL 架构。在 AWS AppSync 控制台的**架构**编辑器中，使用以下片段：

```
type Mutation {
    addUser(userInput: UserInput!): User
    deleteUser(id: ID!): User
}

type Query {
    getUser(id: ID): User
    listUser: [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 数据来源
<a name="configure-your-http-data-source"></a>

要配置 HTTP 数据来源，请执行以下操作：

1. 在 AWS AppSync GraphQL API **的数据源**页面中，选择**创建数据**源。

1. 输入数据来源的名称，例如 `HTTP_Example`。

1. 在**数据来源类型**中，选择 **HTTP 终端节点**。

1. 将终端节点设置为教程开始时创建的 API Gateway 终端节点。如果您导航到 Lambda 控制台并在**应用程序**下面找到您的应用程序，则可以找到堆栈生成的终端节点。在应用程序的设置中，您应该会看到一个 **API 终端节点**，它是您在 AWS AppSync中的终端节点。确保不要将阶段名称作为终端节点的一部分包含在内。例如，如果您的终端节点是 `https://aaabbbcccd.execute-api.us-east-1.amazonaws.com/v1`，您将键入 `https://aaabbbcccd.execute-api.us-east-1.amazonaws.com`。

**注意**  
目前，仅支持公共终端节点 AWS AppSync。  
有关该 AWS AppSync 服务可识别的认证机构的更多信息，请参阅 [HTTPS 端点的认证机构 (CA)](http-cert-authorities.md#aws-appsync-http-certificate-authorities)。 AWS AppSync 

## 配置解析器
<a name="configuring-resolvers"></a>

在该步骤中，您将 HTTP 数据来源连接到 `getUser` 和 `addUser` 查询。

要设置 `getUser` 解析器，请执行以下操作：

1. 在您的 AWS AppSync GraphQL API 中，选择**架构**选项卡。

1. 在**架构**编辑器右侧的**解析器**窗格中的 **Query** 类型下面，找到 `getUser` 字段并选择**附加**。

1. 将解析器类型保留为 `Unit`，并将运行时保留为 `APPSYNC_JS`。

1. 在**数据来源名称**中，选择您以前创建的 HTTP 终端节点。

1. 选择**创建**。

1. 在**解析器**代码编辑器中，添加以下代码片段以作为您的请求处理程序：

   ```
   import { util } from '@aws-appsync/utils'
   
   export function request(ctx) {
   	return {
   		version: '2018-05-29',
   		method: 'GET',
   		params: {
   			headers: {
   				'Content-Type': 'application/json',
   			},
   		},
   		resourcePath: `/v1/users/${ctx.args.id}`,
   	}
   }
   ```

1. 添加以下代码片段以作为您的响应处理程序：

   ```
   export function response(ctx) {
   	const { statusCode, body } = ctx.result
   	// if response is 200, return the response
   	if (statusCode === 200) {
   		return JSON.parse(body)
   	}
   	// if response is not 200, append the response to error block.
   	util.appendError(body, statusCode)
   }
   ```

1. 选择 **Query (查询)** 选项卡，然后运行以下查询：

   ```
   query GetUser{
       getUser(id:1){
           id
           username
       }
   }
   ```

   此查询应返回以下响应：

   ```
   {
       "data": {
           "getUser": {
               "id": "1",
               "username": "nadia"
           }
       }
   }
   ```

要设置 `addUser` 解析器，请执行以下操作：

1. 选择**架构**选项卡。

1. 在**架构**编辑器右侧的**解析器**窗格中的 **Query** 类型下面，找到 `addUser` 字段并选择**附加**。

1. 将解析器类型保留为 `Unit`，并将运行时保留为 `APPSYNC_JS`。

1. 在**数据来源名称**中，选择您以前创建的 HTTP 终端节点。

1. 选择**创建**。

1. 在**解析器**代码编辑器中，添加以下代码片段以作为您的请求处理程序：

   ```
   export function request(ctx) {
       return {
           "version": "2018-05-29",
           "method": "POST",
           "resourcePath": "/v1/users",
           "params":{
               "headers":{
                   "Content-Type": "application/json"
               },
           "body": ctx.args.userInput
           }
       }
   }
   ```

1. 添加以下代码片段以作为您的响应处理程序：

   ```
   export function response(ctx) {
       if(ctx.error) {
           return util.error(ctx.error.message, ctx.error.type)
       }
       if (ctx.result.statusCode == 200) {
           return ctx.result.body
       } else {
           return util.appendError(ctx.result.body, "ctx.result.statusCode")
       }
   }
   ```

1. 选择 **Query (查询)** 选项卡，然后运行以下查询：

   ```
   mutation addUser{
       addUser(userInput:{
           id:"2",
           username:"shaggy"
       }){
           id
           username
       }
   }
   ```

   如果再次运行 `getUser` 查询，它应该会返回以下响应：

   ```
   {
       "data": {
           "getUser": {
           "id": "2",
           "username": "shaggy"
           }
       }
   }
   ```

## 调用服务 AWS
<a name="invoking-aws-services-js"></a>

您可以使用 HTTP 解析器为服务设置 GraphQL API 接口 AWS 。对的 HTTP 请求 AWS 必须使用[签名版本 4 流程](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)进行签名，这样 AWS 才能识别谁发送了这些请求。 AWS AppSync 当您将 IAM 角色与 HTTP 数据源关联时，代表您计算签名。

您还提供了两个额外的组件来使用 HTTP 解析器调用 AWS 服务：
+ 有权调用 AWS 服务的 IAM 角色 APIs
+ 数据来源中的签名配置

例如，如果您想使用 HTTP 解析器调用该[ListGraphqlApis 操作](https://docs.aws.amazon.com/appsync/latest/APIReference/API_ListGraphqlApis.html)，请先[创建一个附加以下策略的 IAM 角色](attaching-a-data-source.md#aws-appsync-getting-started-build-a-schema-from-scratch)： AWS AppSync 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "appsync:ListGraphqlApis"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

------

接下来，为创建 HTTP 数据源 AWS AppSync。在本示例中，您在美国西部（俄勒冈）区域调用 AWS AppSync 。在名为 `http.json` 文件中设置以下 HTTP 配置，其中包括签名区域和服务名称：

```
{
    "endpoint": "https://appsync.us-west-2.amazonaws.com/",
    "authorizationConfig": {
        "authorizationType": "AWS_IAM",
        "awsIamConfig": {
            "signingRegion": "us-west-2",
            "signingServiceName": "appsync"
        }
    }
}
```

然后，使用创建具有关联角色的数据源，如下所示： AWS CLI 

```
aws appsync create-data-source --api-id <API-ID> \
                               --name AWSAppSync \
                               --type HTTP \
                               --http-config file:///http.json \
                               --service-role-arn <ROLE-ARN>
```

当您将解析器附加到架构中的字段时，请使用以下请求映射模板进行调用 AWS AppSync：

```
{
    "version": "2018-05-29",
    "method": "GET",
    "resourcePath": "/v1/apis"
}
```

当您对该数据源运行 GraphQL 查询时，使用您提供的角色对请求进行 AWS AppSync 签名，并在请求中包含签名。该查询会返回您在该区域的账户 APIs 中的 AWS AppSync GraphQL 列表。 AWS 