

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Usando resolvedores HTTP em AWS AppSync
<a name="tutorial-http-resolvers-js"></a>

AWS AppSync permite que você use fontes de dados compatíveis (ou seja, Amazon DynamoDB AWS Lambda, Amazon Service ou OpenSearch Amazon Aurora) para realizar várias operações, além de quaisquer endpoints HTTP arbitrários para resolver campos do GraphQL. Depois que os endpoints HTTP estiverem disponíveis, conecte-se a eles usando uma fonte de dados. Em seguida, configure um resolvedor no esquema para executar operações do GraphQL, como consultas, mutações e assinaturas. Esse tutorial apresentará alguns exemplos comuns.

Neste tutorial, você usa uma API REST (criada usando o Amazon API Gateway e o Lambda) com um endpoint GraphQL AWS AppSync .

## Criar uma API REST
<a name="creating-a-rest-api"></a>

Você pode usar o AWS CloudFormation modelo a seguir para configurar um endpoint REST que funcione para este tutorial:

[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)

A AWS CloudFormation pilha executa as seguintes etapas:

1. Configura uma função do Lambda, que contém a lógica de negócios para o seu microsserviço.

1. Configura uma API REST do API Gateway com a seguinte combinação endpoint/method/content de tipos:


****  

| Caminho do recurso da API | Método HTTP | Tipo de conteúdo compatível | 
| --- | --- | --- | 
|  /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  | 

## Criação da API GraphQL
<a name="creating-your-graphql-api"></a>

Para criar a API GraphQL em: AWS AppSync

1. Abra o AWS AppSync console e escolha **Criar API**.

1. Escolha **GraphQL APIs** e, em seguida, escolha **Design do zero**. Escolha **Próximo**.

1. Para o nome da API, digite `UserData`. Escolha **Próximo**.

1. Selecione `Create GraphQL resources later`. Escolha **Próximo**.

1. Revise suas entradas e selecione **Criar API**.

O AWS AppSync console cria uma nova API GraphQL para você usando o modo de autenticação por chave de API. Você pode usar o console para configurar ainda mais sua API GraphQL e executar solicitações.

## Criar um esquema do GraphQL
<a name="creating-a-graphql-schema"></a>

Agora que você tem uma API GraphQL, vamos criar um esquema do GraphQL. No editor de **esquemas** no AWS AppSync console, use o trecho abaixo:

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

## Configurar a fonte de dados HTTP
<a name="configure-your-http-data-source"></a>

Para configurar a fonte de dados HTTP, faça o seguinte:

1. Na página **Fontes de dados** na sua API AWS AppSync GraphQL, escolha **Criar fonte de dados**.

1. Insira um nome para a fonte de dados como `HTTP_Example`.

1. Em **Tipo de fonte de dados**, escolha **Endpoint de HTTP**.

1. Configure o endpoint para o endpoint da API Gateway que foi criado no início do tutorial. Você pode encontrar seu endpoint gerado pela pilha navegando até o console do Lambda e encontrando seu aplicativo em **Aplicativos**. Dentro das configurações do seu aplicativo, você verá um **endpoint de API** que será seu endpoint no AWS AppSync. Lembre-se de não incluir o nome do estágio como parte do endpoint. Por exemplo, se o seu endpoint fosse `https://aaabbbcccd.execute-api.us-east-1.amazonaws.com/v1`, você digitaria `https://aaabbbcccd.execute-api.us-east-1.amazonaws.com`.

**nota**  
No momento, somente endpoints públicos são suportados pelo AWS AppSync.  
Para obter mais informações sobre as autoridades de certificação que são reconhecidas pelo AWS AppSync serviço, consulte [Autoridades de certificação (CA) reconhecidas por AWS AppSync para endpoints HTTPS](http-cert-authorities.md#aws-appsync-http-certificate-authorities).

## Configuração de resolvedores do
<a name="configuring-resolvers"></a>

Nesta etapa, você conectará a fonte de dados HTTP às consultas `getUser` e `addUser`.

Como configurar o resolvedor `getUser`:

1. Na sua API do AWS AppSync GraphQL, escolha a guia **Esquema**.

1. À direita do editor **Esquema**, no painel **Resolvedores** e em tipo **Consulta**, encontre o campo `getUser` e escolha **Anexar**.

1. Mantenha o tipo de resolvedor como `Unit` e o runtime como `APPSYNC_JS`.

1. Em **Nome da fonte de dados**, escolha o endpoint HTTP que você criou anteriormente.

1. Escolha **Criar**.

1. No editor de código **Resolvedor**, adicione o seguinte trecho como seu manipulador de solicitação:

   ```
   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. Adicione o seguinte trecho como seu manipulador de respostas:

   ```
   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. Escolha a guia **Consulta** e, depois, execute a seguinte consulta:

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

   Isso deve retornar a seguinte resposta:

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

Como configurar o resolvedor `addUser`:

1. Escolha a guia **Esquema**.

1. À direita do editor **Esquema**, no painel **Resolvedores** e em tipo **Consulta**, encontre o campo `addUser` e escolha **Anexar**.

1. Mantenha o tipo de resolvedor como `Unit` e o runtime como `APPSYNC_JS`.

1. Em **Nome da fonte de dados**, escolha o endpoint HTTP que você criou anteriormente.

1. Escolha **Criar**.

1. No editor de código **Resolvedor**, adicione o seguinte trecho como seu manipulador de solicitação:

   ```
   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. Adicione o seguinte trecho como seu manipulador de respostas:

   ```
   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. Escolha a guia **Consulta** e, depois, execute a seguinte consulta:

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

   Se você executar a consulta `getUser` novamente, ela deverá retornar a seguinte resposta:

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

## Invocando serviços AWS
<a name="invoking-aws-services-js"></a>

Você pode usar resolvedores HTTP para configurar uma interface AWS de API GraphQL para serviços. As solicitações HTTP AWS devem ser assinadas com o [processo Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) para que seja AWS possível identificar quem as enviou. AWS AppSync calcula a assinatura em seu nome quando você associa uma função do IAM à fonte de dados HTTP.

Você fornece dois componentes adicionais para invocar AWS serviços com resolvedores HTTP:
+ Uma função do IAM com permissões para chamar o AWS serviço APIs
+ Configurar a assinatura na fonte de dados

Por exemplo, se você quiser chamar a [ListGraphqlApis operação](https://docs.aws.amazon.com/appsync/latest/APIReference/API_ListGraphqlApis.html) com resolvedores HTTP, primeiro [crie uma função do IAM](attaching-a-data-source.md#aws-appsync-getting-started-build-a-schema-from-scratch) que AWS AppSync assuma com a seguinte política anexada:

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

****  

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

------

Em seguida, crie a fonte de dados HTTP para AWS AppSync. Neste exemplo, você chamará AWS AppSync na região Oeste dos EUA (Oregon). Configure a seguinte configuração HTTP em um arquivo chamado `http.json`, que inclui a região de assinatura e o nome do serviço:

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

Em seguida, use o AWS CLI para criar a fonte de dados com uma função associada da seguinte forma:

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

Ao anexar um resolvedor ao campo no esquema, use o seguinte modelo de mapeamento de solicitações para chamar AWS AppSync:

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

Quando você executa uma consulta GraphQL para essa fonte de dados, AWS AppSync assina a solicitação usando a função fornecida e inclui a assinatura na solicitação. A consulta retorna uma lista do AWS AppSync GraphQL APIs na sua conta nessa AWS região.