Passagem do corpo binário do API Gateway para o Lambda

1

Acho que acompanhei de perto a documentação e os tutoriais que encontrei até agora, mas ainda assim consigo fazer isso funcionar. Eu simplesmente não consigo convencer a AWS a não tocar nos dados binários que estou postando no corpo.

No meu aplicativo, estou definindo os cabeçalhos Content-Type e Accept da solicitação da API original para application / x-msgpack, que defini como um tipo de mídia binário em Suporte binário:

Eunãodefininadanasolicitaçãodemétodo:

Nasolicitaçãodeintegração,nãoativeioproxyehabiliteiapassagemdocorpodasolicitação:

EuhabiliteioslogsdoCloudWatchparaaexecuçãodoGatewaydeAPIevejoqueaAWSaindaestácodificandonabase64meusdadosbinários:

17:30:29Startingexecutionforrequest:...17:30:29HTTPMethod:POST,ResourcePath:/...17:30:29Methodrequestpath:{}17:30:29Methodrequestquerystring:{}17:30:29Methodrequestheaders:{Accept=application/x-msgpack,Content-Type=application/x-msgpack,...}17:30:29Methodrequestbodybeforetransformations:[BinaryData]17:30:29EndpointrequestURI:https://...17:30:29Endpointrequestheaders:{Accept=application/x-msgpack,...[TRUNCATED-Idon'tseetherestoftheheaders]}17:30:29Endpointrequestbodyaftertransformations:[Base-64encodedbinarydata]17:30:29Sendingrequesttohttps://...

ObservequeoscabeçalhosdesolicitaçãodeterminalforamtruncadosnoslogsdoCloudWatch(nãoostruncouparaessapergunta).Portanto,nãovejoqualéocabeçalhoContent-Type.

Observeaslinhascom"Corpo da solicitação do método antes das transformações" e "Corpo da solicitação do terminal após as transformações". Por que ainda estaria transformando os dados binários para base-64?

As fontes que usei até agora são:

Atualizar

Eu verifiquei a configuração de integração por meio do AWS CLI e entendi:

> aws apigateway get-integration \
  --rest-api-id ... \
  --resource-id ... \
  --http-method POST
{
    "integrationResponses": {
        "200": {
            "selectionPattern": "", 
            "statusCode": "200"
        }
    }, 
    "contentHandling": "CONVERT_TO_TEXT", 
    "cacheKeyParameters": [], 
    "uri": "...", 
    "httpMethod": "POST", 
    "passthroughBehavior": "WHEN_NO_TEMPLATES", 
    "cacheNamespace": "...", 
    "type": "AWS"
}

Percebi o "contentHandling": "CONVERT_TO_TEXT" bit e tentei substituí-lo por "" (valor vazio, que por sua vez removeu a propriedade completamente) e "CONVERT_TO_BINARY" fazendo:

> aws apigateway update-integration \
  --rest-api-id ... \
  --resource-id ... \
  --http-method POST \
  --patch-operations '[{"op":"replace","path":"/contentHandling","value":""}]'

Agora vejo a solicitação de terminal sendo preservada como binária:

10:32:21 Endpoint request body after transformations: [Binary Data]

No entanto, recebo este erro:

10:32:21 Endpoint response body before transformations: {"Type":"User","message":"Could not parse request body into json: Unexpected character ((CTRL-CHAR, code 129))...

E eu não recebo nenhuma atividade nos registros do CloudWatch para minha função do Lambda. E minha função Lambda não é aquela tentando analisar os dados recebidos como JSON. Portanto, ainda em algum lugar ao longo do caminho de integração API-Lambda, os dados estão sendo analisados como JSON, em vez de serem deixados sozinhos como binários.

    
por Ates Goral 11.07.2017 / 16:07

0 respostas