Aws lambda 在serverless.yml文件中,如何自定义默认http响应模板?

Aws lambda 在serverless.yml文件中,如何自定义默认http响应模板?,aws-lambda,aws-api-gateway,serverless-framework,Aws Lambda,Aws Api Gateway,Serverless Framework,看看这里的文档,似乎没有太多关于设置这些模板的细节 我目前希望删除默认的application/json内容类型,它是在创建处理程序的集成响应(如下图所示)期间生成的,并将其替换为text/html。是否有定义的语法用于如何在某个隐藏的地方执行此操作?或者在框架的当前范围内不可能实现这种定制级别 这是我在serverless.yml中定义的端点 events: - http: method: any path: / inte

看看这里的文档,似乎没有太多关于设置这些模板的细节

我目前希望删除默认的
application/json
内容类型,它是在创建处理程序的集成响应(如下图所示)期间生成的,并将其替换为
text/html
。是否有定义的语法用于如何在某个隐藏的地方执行此操作?或者在框架的当前范围内不可能实现这种定制级别

这是我在serverless.yml中定义的端点

events:
      - http:
          method: any
          path: /
          integration: lambda
          request:
            region: ${env:AwsRegion}
          response:
            headers:
              Content-Type: "'text/html'"
            template: $input.path('body')
       - http:
          method: any
          path: /{proxy+}
在AWS Api网关上生成以下配置:

作为猜测,我确实尝试过这样修改规范,但它抛出了一个语法错误:

template: 
  text\html: $input.path('body')
让它工作 框架似乎并不真正支持这一点,但可以通过(ab)在无服务器模板中使用
statusCodes
将其黑客攻击在一起

将响应模板移动到状态代码下,并为该状态代码提供一个
模式
,就完成了我认为您所追求的目标。语法:

      - http:
          method: any
          path: /
          integration: lambda
          request:
            region: us-east-1
          response:
            headers:
              Content-Type: "'text/html'"
            statusCodes:
              200:
                pattern: ""
                template:
                  text/html: $input.path('body')
注意:
模式和
模板都必须存在


真的有那么糟糕吗? 这最终取决于你。我称之为黑客,因为:

  • 如果能够在
    response.template
    级别提供,而不是在
    response.statusCodes.200.template
    级别提供,那就更好了
  • 指定一个或多个
    statusCodes
    将删除未指定任何值时获得的默认lambda错误正则表达式集
  • 它感觉像是在处理这样一个事实,即
    response.template
    只接受一个字符串,而它可以(应该?)接受一个字符串或一个对象(就像它在
    statusCodes
    下所做的那样)

修好它? 来自
/lib/plugins/aws/package/compile/events/apiGateway/lib/method/integration.js

        if (http.response.template) {
          _.merge(integrationResponse.ResponseTemplates, {
            'application/json': http.response.template,
          });
        }

        if (config.template) {
          const template =
            typeof config.template === 'string'
              ? { 'application/json': config.template }
              : config.template;

          _.merge(integrationResponse.ResponseTemplates, template);
        }

我认为在
response.template
下,第一个
if()
中的代码需要更像第二个
if()

中的代码,我认为对于响应模板,您只需将其放入
template
中即可<代码>模板:$input.path('body')
。响应类型由
内容类型处理。对于请求模板,您可以根据内容类型使用不同的模板,在这种情况下,您可以按照尝试的方式进行操作。