七爪源码:AWS HTTP API 网关的压缩

AWS HTTP API 提供了一种在 AWS 中部署基于 REST 的 API 的新方法;提供对原始 REST API 的许多简化。

但是,在使用 HTTP API 时,我们需要注意一些问题,例如处理程序参数使用什么类型。 REST API 还用于提供一种启用有效负载压缩的方法。但是对于 HTTP API,我们需要自己压缩有效载荷。

值得庆幸的是,这相对简单,我将在下面解释所需的每个步骤。对于那些寻求快速解决方案的人,我创建了一个库 lambda-compression,您可以按如下方式使用。

用库压缩

lambda-compression 库仅提供一种方法 compress 接受由 HTTP API 传递到处理程序函数的事件变量和“结构化”结果(请参阅格式 2.0 的 Lambda 函数响应)。

compress 函数将返回一个结构化结果,该结果可以作为处理函数的结果返回。

该库可以作为 Node 依赖项安装:

npm i lambda-compressionyarn add lambda-compression

这是一个使用 JavaScript 的示例实现:

import { compress } from 'lambda-compression';export const handler = async (event, context) => {  return compress(event, {    statusCode: 201,    headers: {      'Content-Type': 'application/json',    },    body: '{"data":"hello"}',  });};

这里是使用 TypeScript 的示例实现:

import { compress } from 'lambda-compression';import {  Handler,  APIGatewayProxyEventV2,  APIGatewayProxyResultV2,} from 'aws-lambda';type ProxyHandler = Handler;export const handler: ProxyHandler = async (event, context) => {  return compress(event, {    statusCode: 201,    headers: {      'Content-Type': 'application/json',    },    body: '{"data":"hello"}',  });};


压缩所需的步骤

实现压缩所需的逻辑非常简单,因为我们可以依赖 Node.js 中提供的 zlib 包。

在此处查看完整的源代码示例:lambdaCompression.ts

本质上,我们需要:

  • 通过查询 accept-encoding 标头来确定客户端接受哪些压缩格式。
  • 如果客户端不支持压缩,则返回未压缩的负载。
  • 如果客户端确实支持压缩:
  • 应用支持的压缩格式(br、gzip 或 deflate),
  • Base64 编码结果,
  • 在结果中设置 isBase64Encoded 属性,然后
  • 将 Base64 编码结果设置为返回响应的正文。


最后的想法

压缩可能是 CPU 密集型的,因此如果可以预期重复返回相同的结果,则缓存压缩结果可能是谨慎的。也可以将您的 API 放在 CloudFront 分配之后,该分配可以在有限的情况下负责压缩有效负载。最后,恢复使用 REST API 还可以使用内置的压缩​功能。

如果您有任何改进图书馆的想法,欢迎提交问题。

关注七爪网,获取更多APP/小程序/网站源码资源!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章