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:
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.