It seems my question maybe a little similar to this one.
I have an API within my API Gateway
and am doing a HTTP proxy through to an endpoint that POST's multipart/form-data
files.
If I call the HTTP endpoint directly (not through the API gateway
) - using postman
, it works as expected, however, using the API gateway endpoint (through postman
) fails.
I have compared both requests (through fiddler
and CloudWatch
logs) which seem to be identical:
Request for direct API call (working):
POST https://domainname/api/v1/documents HTTP/1.1 Host: api.service Connection: keep-alive Content-Length: 202 Authorization: AuthToken Postman-Token: a75869d6-1d64-6b9f-513d-a80ac192c8e1 Cache-Control: no-cache Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop docMetaInfo: some extra data needed User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryB85rsPlMffA2fziS Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.8 ------WebKitFormBoundaryB85rsPlMffA2fziS Content-Disposition: form-data; name=""; filename="Test.txt" Content-Type: text/plain This is a test Text File ------WebKitFormBoundaryB85rsPlMffA2fziS--
Request from the API Gateway (not working):
POST https://GATEWAY_domainname/api/v1/documents HTTP/1.1 Host: api-Gateway.service Connection: keep-alive Content-Length: 202 Authorization: AuthToken Postman-Token: e25536fa-3dfa-ddcb-8ca6-3f3552d2bc40 Cache-Control: no-cache Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop docMetaInfo: some extra data needed User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundarybX9MyWBsuLGm6QIC x-api-key: ********************* Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.8 ------WebKitFormBoundarybX9MyWBsuLGm6QIC Content-Disposition: form-data; name=""; filename="Test.txt" Content-Type: text/plain This is a test Text File ------WebKitFormBoundarybX9MyWBsuLGm6QIC--
I have tried a few things from the gateway side, including changing the Integration Request
to map a new body for the same content-type, no luck.
As far as I am aware, I should only need to passthrough
this call, hence why it's becoming a little confusing - there should be no need for data manipulation / interception?
The error I get is 400 - bad request (complaining about the file
not being found), but as you can see in the request, it's there.
Any ideas?
EDIT Logs from CloudWatch on the same APIGateway POST
Error is still 400 - no file found
API Gateway can act as a passthrough, sending all data directly to a Lambda function. This makes it possible to send multipart/form-data to a lambda for processing.
The multipart mime format is used to pass lists of content bodies. Multiple content bodies are embedded in one message. multipart/form-data is often found in web application HTML Form documents and is generally used to upload files.
API Gateway does not currently support multipart form data. This is being considered for future development. In the meantime, you will need to modify your client to use multiple requests or a single one-part request.
Update: API Gateway now supports binary payloads. Simply define multipart/form-data
as a binary media type for your API and proxy the payload directly to a Lambda function. From there you can parse the body to get your file content. There should be libraries available to help parse the multipart body (parse-multipart in Node.js for example).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With