

# Configurar uma integração de proxy do Lambda com streaming de resposta da carga útil no API Gateway
<a name="response-transfer-mode-lambda"></a>

É possível realizar o streaming da resposta de uma função do Lambda para melhorar a performance do tempo até o primeiro byte (TTFB) e enviar respostas parciais de volta ao cliente assim que elas se tornam disponíveis. O API Gateway exige que você use a API [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) do Lambda para invocar sua função do Lambda. O API Gateway transmite um objeto de evento para a função do Lambda. A função do Lambda do backend analisa os dados da solicitação recebida para determinar a resposta que ela retorna. Para o API Gateway transmitir a saída do Lambda, a função do Lambda deve gerar o [formato](#response-transfer-mode-lambda-format) exigido pelo API Gateway.

## Diferenças nas integrações de proxy do Lambda entre o modo de transferência de fluxo e resposta em buffer
<a name="response-transfer-mode-lambda-comparison"></a>

A lista a seguir descreve as diferenças entre uma integração do proxy do Lambda e uma integração do proxy do Lambda para streaming de resposta:
+ O API Gateway utiliza a API [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) para invocar a integração do proxy do Lambda para streaming de respostas. Isso gera um URI diferente, que é o seguinte:

  ```
  arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations
  ```

  Esse ARN utiliza uma data diferente para a versão da API e uma ação de serviço diferente em comparação à integração do proxy do Lambda.

  Se você utiliza o console do API Gateway para streaming de respostas, o console usa o URI correto para você.
+ Em uma integração do proxy do Lambda, o API Gateway envia a resposta ao cliente somente depois de receber a resposta completa do Lambda. Em uma integração do proxy do Lambda para streaming de resposta, o API Gateway inicia o fluxo de carga útil depois de receber os metadados e o delimitador válidos do Lambda. 
+ A integração do proxy do Lambda para streaming de respostas utiliza o mesmo formato de entrada que o da integração de proxy, mas exige um formato de saída diferente.

## Formato de integração do proxy do Lambda para streaming de resposta
<a name="response-transfer-mode-lambda-format"></a>

Quando o API Gateway invoca uma função do Lambda com streaming de resposta, o formato de entrada é igual ao formato de entrada de uma função do Lambda para integração de proxy. Para obter mais informações, consulte [Formato de entrada de uma função do Lambda para integração de proxy](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format). 

Quando o Lambda transmite uma resposta para o API Gateway, ela deve seguir o formato a seguir. Esse formato utiliza um delimitador para separar o JSON dos metadados e a carga útil bruta. Nesse caso, os dados da carga útil são transmitidos no decorrer do streaming realizado pela função de streaming do Lambda:

```
{
  "headers": {"headerName": "headerValue", ...},
  "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
  "cookies" : ["cookie1", "cookie2"],
  "statusCode": httpStatusCode
}<DELIMITER>PAYLOAD1 | PAYLOAD2 | PAYLOAD3
```

Na saída:
+ As chaves `headers`, `multiValueHeaders`, `cookies` e `statusCode` poderão ficar sem especificação se nenhum cabeçalho de resposta extra precisar ser exibido.
+ A chave `headers` só pode conter cabeçalhos de valor único.
+ A saída espera que os cabeçalhos contenham `Transfer-Encoding: chunked` ou `Content-length: number`. Se sua função não exibir nenhum desses cabeçalhos, o API Gateway anexará `Transfer-Encoding: chunked` ao cabeçalho de resposta.
+ A chave `multiValueHeaders` pode conter cabeçalhos de vários valores e cabeçalhos de valor único. Você pode usar a chave `multiValueHeaders` para especificar todos os seus cabeçalhos extras, incluindo os de valor único.
+ Se você especificar valores para `headers` e `multiValueHeaders`, o API Gateway os mesclará em uma única lista. Se o mesmo de chave/valor for especificado em ambos, somente os valores de `multiValueHeaders` aparecerão na lista mesclada.
+ Os metadados devem ser JSON válido. Somente as chaves `headers`, `multiValueHeaders`, `cookies` e `statusCode` são aceitas.
+ Você deve fornecer um delimitador após o JSON dos metadados. O delimitador deve ter 8 bytes nulos e deve aparecer nos primeiros 16 KB de dados do fluxo.
+ O API Gateway não exige um formato específico para a carga útil de resposta do método.

Se você estiver usando um URL da função para transmitir sua função do Lambda, deverá modificar a entrada e a saída da sua função do Lambda para atender a esses requisitos.

Se a saída da função do Lambda não atender aos requisitos desse formato, o API Gateway ainda poderá invocar sua função do Lambda. A tabela a seguir mostra as combinações das configurações de solicitação de integração da API e do código da função do Lambda que comportam o API Gateway. Isso inclui combinações aceitas pelo modo de transferência de resposta em buffer.


| Modo de transferência de resposta | O código da função segue o formato exigido | API de invocação do Lambda | Aceito pelo API Gateway. | 
| --- | --- | --- | --- | 
|  Fluxo  |  Sim  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Sim. O API Gateway transmite sua resposta.  | 
|  Fluxo  |  Não  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Não. O API Gateway invocará a função do Lambda e exibirá uma resposta de erro de 500.  | 
|  Fluxo  |  Sim  |   [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Fluxo  |  Não  |   [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Armazenado em buffer  |  Sim  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Armazenado em buffer  |  Não  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Armazenado em buffer  |  Sim  |   [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  O API Gateway exibe os cabeçalhos HTTP e o código de status, mas não o corpo da resposta.  | 
|  Armazenado em buffer  |  Não  |   [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Sim. Esta é uma integração do proxy do Lambda. Para acessar mais informações, consulte [Integração do proxy do Lambda](set-up-lambda-proxy-integrations.md).  | 