amazon-web-services - AWS Application Load Balancer (ALB) passing requests to lambda with body base64 encoded?
问题描述
I have an AWS ALB with SSL turned on. When I try to access the web page, the ALB calls a lambda function with form data. When not configured to run SSL, everything works fine. But, with SSL, the body shows up base64 encoded. I could just decode it and use it, except that it doesn't decode to a useful format (see below). How do I get the form data is a useful format? (IE: json)
Thanks
base64 encoded body:
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTk2OTM2MjQ3MTIzNDE5MTIwOTQ1MDE3Ng0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJmaXJzdE5hbWUiDQoNCkZyZWQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS05NjkzNjI0NzEyMzQxOTEyMDk0NTAxNzYNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ibGFzdE5hbWUiDQoNCkZsaW5zdG9uZQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTk2OTM2MjQ3MTIzNDE5MTIwOTQ1MDE3Ni0tDQo=
decoded body:
b'----------------------------969362471234191209450176\r\nContent-Disposition: form-data; name="firstName"\r\n\r\nFred\r\n----------------------------969362471234191209450176\r\nContent-Disposition: form-data; name="lastName"\r\n\r\nFlinstone\r\n----------------------------969362471234191209450176--\r\n'
解决方案
因此,在上面的示例中,ALB 正确地编码了所有内容。它准确地向您展示了 curl 发送的内容。
当您使用该curl --form
选项时,您得到的是Content-Type: multipart/form-data boundary=<divider string>
. 如果您检查请求标头,您可以看到这一点。这是该信息的示例。
--------------------------b788e21bda17cfad Content-Disposition: form-data; name="firstName"
Fred
--------------------------b788e21bda17cfad Content-Disposition: form-data; name="lastName"
Smith
--------------------------b788e21bda17cfad--
我假设您期待更常见的application/x-www-form-urlencoded
内容类型。为此,请使用
curl -X POST -d "firstName=Fred" -d "lastName=Smith" <URL>
,这将导致更熟悉的正文内容:
first=Fred&lastName=Smith
最后要将您的请求发布为 JSON,请使用:
curl -X POST -H "Content-Type: application/json" --data '{"firstName": "Fred","lastName": "Smith"}' <URL>
最后一点:奇怪的是,当您通过 ALB 发送 JSON 时,即使启用了 SSL,它也不会对正文进行 base64 编码。请记住正确设置内容类型,以便 ALB 知道您正在发送 JSON。
推荐阅读
- r - 对于`Petal.Length`的固定值和`Species`,如何绘制`Sepal.Length`和`Sepal.Width`之间的关系?
- android - 当设备在 react-native 中离线时,在 webview 中显示本地图像
- javascript - 为文本框创建一个刷新按钮
- linux - ioctl 中的命令 21505 是什么意思?
- reactjs - 如何解决这个元素类型是反应中的无效错误?
- flutter - 如何在 Appbar Flutter 中定位项目
- javascript - 根据 typeScript 中的多个条件过滤对象数组
- java - 将 rx observable api 调用转换为 kotlin 协程
- javascript - Angular 在搜索字段和搜索结果中记住最新的输入数据
- machine-learning - 如何区分填充xgboost的特征真值0和缺失值0?