我有这个 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 文件...
这个:
只是 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
我如何得到这个,以便响应导致文件实际下载?!
我已经接近了一点,但仍然没有完整的雪茄......
在 API 网关页面上,对于我的端点,我执行以下操作:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
(空模型)text/csv
(空模型)如果你尝试这样做,它在你的控制台上应该看起来像这样:
在邮递员方面,我只需将所需的
Accept
分配给 Content-Type
标头(在本示例中为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
)。
当我发送和下载时,我仍然看到一个没有类型或文本文件类型的文件。
但是,我可以使用 MS Excel(或类似的电子表格编辑器)打开它并查看我的 Excel 文件...
这仍然不完全是我想要的,因为用户/客户端不应该协商文件类型......!他们应该能够直接从 API 端点获取正确类型的文件!
我欢迎对此的任何答案...