Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在lambda中解压缩作为二进制数据接收的数据-错误的报头检查

在lambda中解压缩作为二进制数据接收的数据-错误的报头检查
EN

Stack Overflow用户
提问于 2019-04-10 11:45:09
回答 2查看 1.3K关注 0票数 3

我想发送压缩数据(gzip)到一些URL,这将触发(代理) lambda函数,这将解压缩数据。

λ函数(NodeJS 8):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let zlib = require('zlib');
exports.handler = async (event) => {
    let decompressedData = zlib.gunzipSync(event['body'])
    return {
        "statusCode": 200,
        "body": decompressedData.toString()
    };
};

我使用curl命令触发它(通过API网关),对于一些我用gzip压缩example.gz的文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -X POST --data-binary @example.gz https://URL...

结果,我得到了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"message": "Internal server error"}

错误是(Cloudwatch中的日志):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   "errorMessage": "incorrect header check",
    "errorType": "Error",
    "stackTrace": [
        "Gunzip.zlibOnError (zlib.js:153:15)",
        "Gunzip._processChunk (zlib.js:411:30)",
        "zlibBufferSync (zlib.js:144:38)",
        "Object.gunzipSync (zlib.js:590:14)",
        "exports.handler (/var/task/test_index.js:5:33)"
    ]

当我查看event['body']本身时,我看到的数据与我在example.gz中看到的完全相同。也许我需要一些特殊的标题?我只想按原样传递数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-12 15:28:32

正如Michael - sqlbot所说,默认情况下,API Gateway不能将二进制数据传递给Lambda函数。

适合我的方法:我在curl命令中添加了头Content-Type: application/octet-stream,在Binary Media Types上的API网关设置中添加了application/octet-stream

这样,数据在base64中传递,然后我只是将base64中的日期转换为缓冲区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let data = Buffer.from(event['body'], "base64")

然后再解压。

有关更多信息,请访问read here

票数 2
EN

Stack Overflow用户

发布于 2019-04-10 12:09:09

1/首先,您需要正确地构建gzip,确保gzip文件头文件不存在:curl command a gzipped POST body to an apache server

错误的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo '{ "mydummy" : "json" }' > body
gzip body
hexdump -C body.gz
00000000  1f 8b 08 08 20 08 30 59  00 03 62 6f 64 79 00 ab  |.... .0Y..body..|
00000010  56 50 ca ad 4c 29 cd cd  ad 54 52 b0 52 50 ca 2a  |VP..L)...TR.RP.*|
00000020  ce cf 53 52 a8 e5 02 00  a6 6a 24 99 17 00 00 00  |..SR.....j$.....|
00000030

好方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo '{ "mydummy" : "json" }' | gzip > body.gz
hexdump -C body.gz
00000000  1f 8b 08 00 08 0a 30 59  00 03 ab 56 50 ca ad 4c  |......0Y...VP..L|
00000010  29 cd cd ad 54 52 b0 52  50 ca 2a ce cf 53 52 a8  |)...TR.RP.*..SR.|
00000020  e5 02 00 a6 6a 24 99 17  00 00 00                 |....j$.....|
0000002b

2/在curl中,不要忘记用以下命令指定内容编码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-H "Content-Encoding: gzip"

3/另外,如果你使用express+compress,你不需要调用zlib

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 curl -X POST "http://example.org/api/a" -H "Content-Encoding: gzip" -H "Content-Type: application/json" --data-binary @body.gz

router.post("/api/a", function(req, res){
    console.log(req.body); // { mydummy: 'json' }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55611758

复制
相关文章
如何自动转发接收的请求报头?
了解OpenTelemetry的朋友应该知道,为了将率属于同一个请求的多个操作(Span)串起来,上游应用会生成一个唯一的TraceId。在进行跨应用的Web调用时,这个TraceId和代表跟踪操作标识的SpanID一并发给目标应用,W3C还专门指定了一份名为Trace Context的标准,该标准确定了一个名为trace-parent的请求报头来传递TraceId、(Parent)SpanID以及其他两个跟踪属性。其实我们的应用也可能会使用到分布式跟踪这种类似的功能,我们需要在某个应用中添加一些“埋点”,当它调用另一个应用时,这些埋点会自动添加到请求的报头集合中,从而实现在整个调用链中自动传递。为了实现这个功能,我创建了一个名为HeaderForwarder(Github)的框架。本文不会介绍HeaderForwarder的设计,仅仅介绍它的使用方式,有兴趣的朋友可以查看源代码。
蒋金楠
2023/06/09
3050
如何自动转发接收的请求报头?
JavaScript中的二进制数据
在我编写 js 代码中,关于处理二进制数据了解甚少,好像都是用数组表示,但是成员又很模糊。尤其是在遇到一些 http 的 post 请求或 websocket,发送二进制数据(字节)时,还有一些算法的翻译,数据的转化,协议的复现,都需要不断的从网络上查阅,并未系统的从文档教程中入手。于是写这篇的目的就是为了加固对二进制数据的理解,以及 JavaScript 中如何操作二进制数据的。
愧怍
2022/12/27
2.2K0
【说站】java中UDP接收数据的步骤
以上就是java中UDP接收数据的步骤,希望对大家有所帮助。更多Java学习指路:Java基础
很酷的站长
2022/11/23
1.1K0
【说站】java中UDP接收数据的步骤
SpringMVC中controller接收Json数据
SpringMVC中controller接收Json数据 1.jsp页面发送ajax的post请求: function postJson(){ var json = {"username" : "imp", "password" : "123456"}; $.ajax({ type : "post", url : "<%=basePath %>ajaxRequest", contentType : "application/json;chars
用户2409797
2018/08/30
2.7K0
大数据系统的Lambda架构
在大数据处理系统中,如何有效地将real time与batch job结合起来,既发挥前者对响应的实时性,又能解决对海量数据的分析与处理?答案就是Lambda架构思想。 Mathan Marz的大作Big Data: Principles and best practices of scalable real-time data systems介绍了Labmda Architecture的概念,用于在大数据架构中,如何让real-time与batch job更好地结合起来,以达成对大数据的实时处理。 传
张逸
2018/03/07
1.4K0
大数据系统的Lambda架构
JS中的二进制数据处理
  在现有的计算机中,二进制常常以字节数组的形式存在于程序当中。例如在C#里面,就用byte[],标准C里面没有byte类型,但可以通过typedef把byte定义为unsigned char的别名,效果是一样的。JS设计之初似乎就没想过要处理二进制,对于字节的概念可以说是非常非常的模糊。如果要表达字节数组,那么似乎只能用一个普通数组来表示。
有赞coder
2021/05/13
3.7K0
JS中的二进制数据处理
springmvc接收数据返回数据
1,当前端传递的参数名和方法形参名不一致时,通过@RequestParam指定转换关系
微醺
2019/01/17
1.5K0
MONGODB 可以在应用系统中作为核心数据库?
知道最近也会听到一个声音,MONGODB 不能在核心的系统使用, 哎, 2021年了,现在有些系统都没有传统数据库的身影,而代替的是通过ES,REDIS ,Aerospike 这样的数据库来成功上位到这个系统的核心数据库, 那么MONGODB 为什么不可以成为项目的核心数据库?
AustinDatabases
2021/06/10
1.4K0
MONGODB   可以在应用系统中作为核心数据库?
[物联网]2.2接收数据
数据接收服务器的作用 数据接收服务器就跟它的字面意思一样,负责接收从设备发送来的数据。它在设备和系统之间起着桥梁作用。有很多种方法可以从设备把数据发送给服务器,其中具有代表性的包括以下两种方法。 ● 准备一个使用了 HTTP 协议的 Web API 来访问设备(如通常的 Web 系统) ● 执行语音和视频的实时通信(如 WebSocket 和 WebRTC) 除此之外,还出现了一种名为 MQTT 的、专门针对物联网的新型通信协议。 本章将为大家介绍 HTTP 协议、 WebSocket、 MQTT 这几个典型协议。 HTTP 协议 HTTP 协议提供的是最大众化且最简易的方法。使用一般的 Web 框架就可以制作数据接收服务器。设备用 HTTP 的 GET 方法和 POST 方法访问服务器,把数据存入请求参数和 BODY 并发送(图 2.6)。 HTTP 协议是 Web 的标准协议,这一点自不用说。因此 HTTP 协议和 Web 的兼容性非常强。此外,因为 HTTP 协议有非常多的技术诀窍,所以我们必须在制作实际系统时审视服务器的结构,应用程序的架构以及安全性等。关于这点,有很多事例值得参考。另外, HTTP 协议还准备了 OSS 的框架,方便人们使用。
科控物联
2022/03/29
2.3K0
[物联网]2.2接收数据
spring boot 项目 如何接收 http 请求中body 体中的数据?
在与华为北向IOT平台对接的过程中,在已经打通了创建订阅这个功能之后。遇到了一个回调地址接口编写的问题。 由于我们编写的回调地址接口,是用来接收华为设备的实时数据。所以查看了接口文档得知,他推送的数据,全部放在了请求的请求体中,即body中。我们的接口该 如何接收呢?考虑到我们使用的是spring boot 框架进行开发的。所以,我们最终拿到了一个可行的方案。 特此记录如下:
爱明依
2019/03/12
3.4K0
scrapy在cmd中检查
1,scrapy shell 2,fetch('http://gk.scsn.gov.cn/Search.aspx?columnId=40012') 抓取网页 3。response.xpath('//
Centy Zhao
2019/12/26
7590
使用flume完成数据的接收
使用flume完成数据的接收 场景:source是通过tcp发送,chnnel处理过滤字段,sink存在集群中
ZONGLYN
2019/08/08
6790
后台接收fetch传递的post数据
但是像上面这样写后台按照以前接收变量的方式总是接收null。造成这个的原因是因为这样向服务器提交的数据是一个json数据,而不是传统的formdata。如下图所示:
IT工作者
2021/12/30
1.8K0
GET/POST接收或发送数据的问题
SpringCloud实战视频下载 在文章开始,先来回忆一下GET、POST这两种请求方式的区别。 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。 0、GET请求,请求
企鹅号小编
2018/01/25
1.4K0
Redis中的Stream数据类型作为消息队列的尝试
Redis的List数据类型作为消息队列,已经比较合适了,但存在一些不足,比如只能独立消费,订阅发布又无法支持数据的持久化,相对前两者,Redis Stream作为消息队列的使用更为有优势。
Java_老男孩
2019/12/02
1.4K0
在VS中调试LINQ(Lambda)
Linq调试有3种方法,准确来说是2种,因为LinqPad算是复制代码段到外部了。。
过千帆
2021/04/08
4.7K0
数据系统架构——Lambda architecture(Lambda架构)
“我们正在从IT时代走向DT时代(数据时代)。IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好”——阿里巴巴董事局主席马云。
全栈程序员站长
2022/09/12
3.5K0
数据系统架构——Lambda architecture(Lambda架构)
数据在企业演进中的价值
本文作者 吴昊:腾讯SaaS加速器导师、纷享销客天使投资人、前执行总裁,具有20年企业信息化和6年SaaS营销团队创新经验。 (SaaS 创业路线图) 每个 To B 创业者都对自己客户的现状相当了解,但你知道在这个变幻莫测的 VUCA 时代,客户的企业究竟会往哪个方向发展吗? 刚过去的这个周末,我在中欧课堂上听了方二教授的创新战略课程,对此有了更全面的的认知。今天给大家分享一下。(课程现场非常精彩,我只陈述了1%的内容,大家自己找机会在各种场合现场听吧。) 方教授的课叫做《互联网和智能商业的创新
腾讯SaaS加速器
2020/06/09
7240
lambda表达式在实际开发中的使用
作为写代码已经两年的程序员了,lambda已经是再熟悉不过了。其实在众多的编程语言中,python javascript java中都有lambda的影子。包括比较新的编程语言golang,到最后发现其实各种语言的语法和特性都是相互抄袭的,所以在接触新技术的时候,很容易触类旁通。
shigen
2023/10/06
2040
lambda表达式在实际开发中的使用
点击加载更多

相似问题

在Android 6.0中从mysql获取json数据

21

从MYSQL中获取数据并显示在JSON文件中

30

mysql获取数据的json响应

12

从MySQL获取JSON数据树

25

使用JSON从MySql获取数据

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文