通过 Postman 从 API Gateway/Lambda POST 请求下载 CSV/XLSX 文件

问题描述 投票:0回答:1

我有这个 API 端点,它连接到这个用 Groovy 编写的 Lambda 函数,它使用

multipart/form-data
并返回 CSV 或 XLSX 文件。

我已启动并运行 Lambda 函数,它以 64 进制字符串形式返回 CSV/XLSX 文件。

但是,在对应用程序进行更多工作之前,我希望能够看到从 Postman 请求下载该文件。

你的函数返回什么?

主体是要返回的文件的 base-64 编码的响应。

响应标头是什么样的?

像这样:

Date: Tue, 17 Oct 2023 03:49:15 GMT
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Length: 31680
Connection: keep-alive
x-amzn-RequestId: 7aeba6af-b8e7-4e01-93b2-c7c01bf803ac
Content-Disposition: attachment; filename=Returned Postcards 0ct 4 2023.XLSX
x-amz-apigw-id: M7WXME3EiYcFyrw=
X-Amzn-Trace-Id: Root=1-652e042d-069a3c126955e0a648434148;Sampled=0;lineage=bad4f2c2:0

请注意,我们在代码中将响应标头定义为:

    Map<String, String> createResponseHeaders(String outputFileName) {
        return [
                ('Content-Type') : this.getContentTypeHeader(outputFileName),
                ('Content-Disposition') : "attachment; filename=${outputFileName}".toString(),
        ]
    }

    private String getContentTypeHeader(String outputFileName) {
        final String fileExtension = FileUtils.GetFileExtension(outputFileName).toLowerCase();
        switch (fileExtension) {
            case "xlsx":
                return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            case "csv":
                return "text/csv";
        }

        throw new IllegalArgumentException("Content type for extension '${fileExtension}' not yet implemented");
    }

类似地,让我们看看返回响应的代码....

当然...最终会变成这样...

    return new APIGatewayProxyResponseEvent()
                .withStatusCode(200)
                .withHeaders(this.createResponseHeaders(outputFile.getName()))
                .withIsBase64Encoded(true)
                .withBody(Base64.getEncoder()
                        .encodeToString(outputFile.bytes))

当您发送和下载时会发生什么?

当我发送和下载时,我会得到一个包含原始 Base-64 输出的 .txt 文件。我没有看到我请求的 XLSX 文件...

您的 API 网关设置是什么样的?

这个:

您的 Postman 请求标头是什么样的?

只是 Postman 生成的默认值:

Content-Type: multipart/form-data; boundary=<calculated when request is sent>
...
User-Agent: PostmanRuntime/7.33.0
Accept: */*
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

我如何得到这个,以便响应导致文件实际下载?!

aws-lambda groovy postman aws-api-gateway
1个回答
0
投票

我已经接近了一点,但仍然没有完整的雪茄......

在 API 网关页面上,对于我的端点,我执行以下操作:

  • 单击方法响应选项卡
  • 单击编辑按钮
  • 将以下内容类型添加到响应正文中:
    • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
      (空模型)
    • text/csv
      (空模型)

如果你尝试这样做,它在你的控制台上应该看起来像这样:

在邮递员方面,我只需将所需的

Accept
分配给
Content-Type
标头(在本示例中为
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
)。

当我发送和下载时,我仍然看到一个没有类型或文本文件类型的文件。

但是,我可以使用 MS Excel(或类似的电子表格编辑器)打开它并查看我的 Excel 文件...

这仍然不完全是我想要的,因为用户/客户端不应该协商文件类型......!他们应该能够直接从 API 端点获取正确类型的文件!

我欢迎对此的任何答案...

© www.soinside.com 2019 - 2024. All rights reserved.