API网关 - 发布multipart \ form-data

时间:2017-01-20 04:35:40

标签: amazon-web-services aws-lambda aws-api-gateway

似乎我的问题可能有点类似to this one

我的API网关中有一个API,我正在通过POST的多部分/表单数据文件的端点进行HTTP代理。

如果我直接调用http端点(而不是通过API网关) - 使用邮递员,它会按预期工作,但是,使用API​​网关端点(通过邮递员)失败。

我已经比较了两个看似相同的请求(通过fiddler和CloudWatch日志):

请求直接API调用(工作):

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

来自API网关的请求(不工作):

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

我在网关方面尝试了一些方法,包括更改Integration Request以映射相同内容类型的新主体,没有运气。

据我所知,我只需要passthrough这个调用,因此为什么它变得有点混乱 - 应该不需要数据操作/拦截?

我得到的错误是400 - 错误的请求(抱怨未找到file),但正如您在请求中看到的那样,它就在那里。

有什么想法吗?

修改 在同一个APIGateway POST上从CloudWatch登录

enter image description here

错误仍然是400 - 找不到文件

6 个答案:

答案 0 :(得分:14)

API Gateway目前不支持多部分表单数据。这正在考虑用于未来的发展。在此期间,您需要修改您的客户端以使用多个请求或单个部分请求。

更新:API网关现在支持二进制有效负载。只需定义" multipart / form-data"作为API的二进制媒体类型,并将有效负载直接代理到Lambda函数。从那里你可以解析正文以获取你的文件内容。应该有可用的库来帮助解析多部分正文(例如,在NodeJS中解析多部分')。

答案 1 :(得分:2)

使用 AWS API Gateway Proxy+ 和 Lambda 从服务器上传和检索图像 通过 AWS Gateway 和 lambda proxy+ 上传和检索图像以及管理二进制数据的代码示例

Check here

答案 2 :(得分:1)

似乎有一个更改,API网关不再对整个Content-Type标头值进行严格匹配,所以现在“二进制”支持的所有内容都按预期工作。

将您的API设置为POST(或PUT)并将Lambda集成设置为“proxy”。转到API的“设置”,然后添加要用作“二进制”的媒体类型。我添加了redirect your routing before your target component created。 接收的媒体类型实际上是: multipart/signed

API GW仍然选择“二进制”并将其作为base64传递给我的Lambda。

在你的Lambda中你会发现这个:

Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg="sha256"; boundary="----54645645645664564563424768"

答案 3 :(得分:1)

已解决https://github.com/mscdex/busboy/issues/199#issuecomment-505239005

我正在使用 express-fileupload 来处理node.js中的多部分表单数据

然后仅在AWS API Gateway上配置设置

选择API =>设置=>二进制媒体类型=>

enter image description here

现在不破坏formdata中的任何文件,一切正常。

答案 4 :(得分:0)

与tomcat服务器集成时,我遇到了同样的问题,发现需要对其进行以下更改以对其进行修复。

    通过控制台
  1. 在api网关的api的 HTTP请求标头中添加 Content-Type ,或将其添加到

    这样的开放api文档中
    {
        "/yourApi":{
            "post":{
                "operationId":"uploadImageUsingPOST",
                "produces":[
                    "application/json"
                ],
                "parameters":[
                {
                    "name":"Content-Type",
                    "in":"header",
                    "required":false,
                    "type":"string"
                },
                {
                    //Other headers
                }]   
            }
        }
    
  2. 在上述步骤中,还请在api的HTTP集成请求标头中添加Content-Type,如果未在其中添加内容类型,然后再添加一个标头 Accept =' / '”,或将其添加到开放式api文档中,例如

    "requestParameters":{
        "integration.request.header.Accept":"'*/*'",
        "integration.request.header.Content-Type":"method.request.header.Content-Type",
        //Other headers
    }
    
  3. 在api的集成请求中将“内容处理”设置为“通过”。

  4. 通过控制台或打开的api文档在api设置中将multipart / form-data作为Binary Media Types添加。

    "x-amazon-apigateway-binary-media-types": [
        "multipart/form-data"
    ]
    
  5. 将以上更改部署到所需阶段,在此阶段您将以多部分的形式上传图像。

Api网关会将您的多部分文件作为二进制数组传递,您仍然可以在控制器中使用@RequestBody MultipartFile multipartFile,并且spring会为您解析此二进制文件。

答案 5 :(得分:0)

对于仍然需要帮助的人,现在已正式记录在案:

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html

总而言之,步骤如下:

  1. 转到API的“ API网关设置”标签,然后将“ multipart / form-data”添加到“二进制媒体类型”部分。
  2. 在代理方法的请求标头中添加“内容类型”和“接受”
  3. 将这些相同的标头添加到集成请求标头中
  4. 重新部署

欢呼