Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

API Gateway - POST multipart/form-data

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

enter image description here

Error is still 400 - no file found

like image 866
Hexie Avatar asked Jan 20 '17 04:01

Hexie


People also ask

Does API gateway support multipart form data?

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.

What is multipart form data in REST API?

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.


1 Answers

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

like image 108
RyanG Avatar answered Oct 21 '22 11:10

RyanG