无服务器框架中的二进制媒体类型支持



有人能帮助我理解无服务器二进制媒体类型支持的实际工作原理吗?

我在yaml文件的提供者部分使用以下内容:

binaryMediaTypes:
- '*/*'

对于每个返回二进制有效载荷的定义函数,我有以下内容:

contentHandling: CONVERT_TO_BINARY

我认为这就是所有需要做的事情,但它似乎不起作用,我的csv文件被下载,但内容仍然是base64编码的,在我的API网关的设置中,二进制媒体类型是空的。然而,如果我转到API GW设置并添加;二进制媒体类型";对于"text/csv",手动并在控制台中重新部署API,当我下载csv时,它看起来没问题。

我认为无服务器框架应该将我在配置文件中定义的值设置为API GW";二进制媒体类型";设置,但它似乎没有任何作用。

当我结合使用几个插件来做这件事时,一切都很好,但我的理解是,现在应该在没有任何插件的情况下工作。

我对api gateway x射线跟踪选项也有类似的问题,当添加到无服务器文件时,该选项不起作用。

有人能帮我吗?如果做不到这一点,我会把它设置成地形。

如果有人想了解支持serverless的二进制媒体类型的过程,请参考:

我个人一直未能找到支持二进制的好的内部无服务器包。这一切现在都直接在无服务器/APIG中处理。

为了回答主要问题,我将分阶段回答:

(1) 您的无服务器包

最大的缺陷是默认的Accept头被设置为*/*,这就是为什么你会在APIG中看到很多关于将二进制媒体类型设置为*/*的文档。不要这样做,这意味着你发送的每个请求都会被编码,这会打乱你的cors方法,给你一个错误的响应。将其添加到您的YAML中,并且在API gateway -> <your api> -> settings -> Binary media type中的API中,一旦部署,您将看到添加的MIME类型。

provider:
apiGateway:
binaryMediaTypes:
- 'application/vnd.mapbox-vector-tile'

这就是您需要添加到无服务器文件中的全部内容。

(2) 您的功能,NODEJS Typescript:

import serverless from 'serverless-http';
import cors from 'cors';
import express from 'express';
import api from './api';
const app = express();

app.use(cors());
app.use('/', api);
export const api: serverless.Handler = serverless(app, {
binary: ['application/vnd.mapbox-vector-tile'],
});

请注意,我使用的是serverless-http包,这一点之所以重要,是因为它允许您设置可接受的MIME类型。

import express, { Request, Response, NextFunction } from 'express';
import axios from 'axios';
const router = express.Router();
router.get('/ping', (req: Request, res: Response) => {
res.send('Pong');
});
router.get('/layers/:gsdata/:z/:x/:y', async (req: Request, res: Response, next: NextFunction) => {
const {
z, x, y, gsdata,
} = req.params;
try {
const response = await axios(
{ method: 'get', url, responseType: 'stream' },
);
res.set({
'Content-Type': 'application/vnd.mapbox-vector-tile',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE',
});
response.data.pipe(res);
} catch (err) {
console.error(err);
next(err);
}
});
export default router;

正如您在这里看到的,我们需要设置内容类型,并确保我们正在返回一个流并将其管道化到我们的响应中。这基本上告诉lambda我们希望将其编码到base64中。

为什么选择base64?-

Base64 encoding schemes are commonly used when there is a need to encode binary data that needs to be stored and transferred over media that are designed to deal with ASCII. This is to ensure that the data remain intact without modification during transport

如果不这样做,您将最终在APIG中丢失数据包。因此,如果将数据作为原始流发送,则数据可能无法工作。

(3) 您的客户端Accept标头

如果你没有向你的请求添加一个accept头,从客户端,你会得到一个base64,如果你添加了一个accept-headerapplication/vnd.mapbox-vector-tile,这将告诉APIG解码响应上的格式

await fetch('<yourAPICall>', { headers: { Accept: 'application/vnd.mapbox-vector-tile' } })

将应用程序/vnd.mapbox-vector-tile的所有情况替换为您接受的二进制介质类型,然后返回


无服务器、APIG二进制媒体类型的流

最新更新