当前位置: 首页 > 知识库问答 >
问题:

通过AWS API网关和Lambda函数返回动态内容类型

孟翰藻
2023-03-14

我错过了什么,为什么这看起来这么难?

共有1个答案

殳毅
2023-03-14

结果发现API网关不是问题所在。我的Lambda函数没有返回正确的头。

为了处理二进制响应,我发现您需要将二进制支持内容类型设置为*/*(也就是所有内容),然后让Lambda函数返回属性isbase64encode设置为true。被base64编码并指示的响应将被解码并作为二进制处理,而其他请求将原样返回。

下面是Lambda函数的一个简单要点,该函数采用给定路径,从S3读取文件并通过API网关返回:

/**
 * This is a simple AWS Lambda function that will look for a given file on S3 and return it
 * passing along all of the headers of the S3 file. To make this available via a URL use
 * API Gateway with an AWS Lambda Proxy Integration.
 * 
 * Set the S3_REGION and S3_BUCKET global parameters in AWS Lambda
 * Make sure the Lambda function is passed an object with `{ pathParameters : { proxy: 'path/to/file.jpg' } }` set
 */

var AWS = require('aws-sdk');

exports.handler = function( event, context, callback ) {
    var region = process.env.S3_REGION;
    var bucket = process.env.S3_BUCKET;
    var key = decodeURI( event.pathParameters.proxy );

    // Basic server response
    /*
    var response = {
        statusCode: 200,
        headers: {
            'Content-Type': 'text/plain',
        },
        body: "Hello world!",
    };
    callback( null, response );
    */

    // Fetch from S3
    var s3 = new AWS.S3( Object.assign({ region: region }) );
    return s3.makeUnauthenticatedRequest(
        'getObject',
        { Bucket: bucket, Key: key },
        function(err, data) {
            if (err) {
                return err;
            }

            var isBase64Encoded = false;
            if ( data.ContentType.indexOf('image/') > -1 ) {
                isBase64Encoded = true;
            }

            var encoding = '';
            if ( isBase64Encoded ) {
                encoding = 'base64'
            }
            var resp = {
                statusCode: 200,
                headers: {
                    'Content-Type': data.ContentType,
                },
                body: new Buffer(data.Body).toString(encoding),
                isBase64Encoded: isBase64Encoded
            };

            callback(null, resp);
        }
    );
};
 类似资料:
  • 问题内容: 我有一个模块分开的应用程序。有几个实体和CSV模块。CSV模块仅支持struct(Entity),但我想使CSV模块可与任何类型的实体一起使用。现在,它的工作方式如下:Csv模块从通道接收数据并将其严格转换为struct。我如何实现动态返回类型,因此它可以与任何类型的Entity一起使用,而不仅限于 问题答案: 快速/肮脏的解决方案: 返回接口{},但是您最终欺骗了编译器,而类型检查的

  • 我有一个lambda,它需要通过api网关(使用lambda集成)返回一个二进制对象和一些http头(例如,内容类型),或者重定向到另一个URL。在二进制支持示例中(例如。https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/)lambda只返回二进制对象(图

  • 我有一个静态的通用FormBuilder超文本标记语言助手方法(HTMLHelper类上的扩展方法),它接受视图模型类型的通用参数,然后当从数据库传递一个或多个字符串属性名称时,生成一个超文本标记语言形式在ASP. NET MVC 5.1 with. NET 4.5中。 我有一个公共方法来生成表单,还有单独的私有方法来生成表单中的“模块”部分,然后渲染其中的每个字段。类型参数从上到下沿此链传递。

  • 在我的C程序中,我使用了一个带有以下参数的void函数:一个2D int数组、一个用于创建新动态数组的int指针和一个最后的int指针,该指针将保存函数内部发生的计数。因此,动态数组是使用malloc在函数中创建的,一切正常,直到调用函数后在main()中打印其元素。我得到的是垃圾,而不是我应该看到的数字。以下是功能代码:

  • 我想知道是否可以使用API网关POST方法将YAML有效负载格式传递给AWS Lambda函数。我不想要任何有效载荷的模型,也不想使用模板检查有效载荷。我只想以YAML格式将数据传递给Lambda。有人成功地做到了这一点吗? 我之前使用JSON有效负载将有效负载传递给Lambda,但由于某些设计问题,我觉得YAML格式的有效负载更适合此任务。我尝试在请求正文中传递YAML有效负载,但出现以下错误。

  • 问题内容: 我正在转换C api> Java,并且具有以下函数原型。 我想按预期返回状态,以整数形式返回“类型”,以字符串形式返回“值”(不被释放) 从文档中,我发现您创建了两个可以保留返回值的结构。 有人可以帮我做第一个吗? 问题答案: 假设函数声明存在于一个名为header.h的文件中,则可以执行以下操作: 这将隐藏“实数” ,而是替换为在(不可修改的)结构中返回输出参数和调用结果的版本。 (