首页 > 解决方案 > AWS Lambda / API Gateway 不通过编码

问题描述

我正在尝试将一个有效的 Lumen API 服务转换为 AWS,并且很难让一个外部 REST API 服务工作。该服务返回压缩的数据,但这一事实并未正确地传递回浏览器中的应用程序 (Vue)。我尝试在响应中添加标题,如下所示,但它仍然无法正常工作。我可以在浏览器控制台的响应中看到标题,但浏览器仍然没有解释它,所以数据看起来仍然像垃圾。关于如何进行这项工作的任何线索?

var req = require('request');
exports.handler = function (event, context, callback) {
    const params = {
        url: 'http://api.service',
        headers: { 'Authorization': 'code',
                'Accept-Encoding': 'gzip,deflate',
                'Content-Type': 'application/json' },
        json: {'criteria': {
                    'checkInDate': '2019-10-22',
                    'checkOutDate': '2019-10-25',
                    'additional': {'minimumStarRating': 0},
                    'cityId': 11774}}
    };
    req.post(params, function(err, res, body) {
        if(err){
            callback(err, null);
        } else{
            callback(null, {
                "statusCode": 200,
                "headers": {
                    "Content-Type": "application/json",
                    "Content-Encoding": "gzip"
                },
                "body": body
            });
        }
    });
};

标签: amazon-web-servicesaws-lambdaaws-api-gateway

解决方案


如果您看到所有乱码字符,很可能您还没有让 API Gateway 将您的 Lambda 答案视为二进制(因为它是从您的 lambda 压缩的)

看一下文档

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html

还有这篇文章

不幸的是,API Gateway 目前没有使用 gzip。如果我们使用的是 HTTP 代理,而另一个 HTTP 端点返回一个 gzip 压缩的响应,它会尝试重新编码,从而混淆响应。

我们必须告诉 API Gateway 将我们的响应视为二进制文件——不要以任何方式接触它。

https://techblog.commercetools.com/gzip-on-aws-lambda-and-api-gateway-5170bb02b543


推荐阅读