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

AWS ApiGateway请求路径映射+lambda

屠和洽
2023-03-14

我知道有很多关于映射请求数据的问题,但这两个都帮不了我。所以,我试图实现的是一个映射到lambda的APIendpoint。当bucket触发404时,将转发到该endpoint的请求,并且参数通过请求路径传递给lambda,例如:/{image_name}/{width}/{height}。lambda的代码只调用context.succeed(event,context);

在集成请求中,我创建了三个映射模板:plain/text、plain/html、application/json,其定义与Bellow相同:

#set($inputRoot = $input.path('$'))
{
    "name": $input.params('name'),
    "width" : $input.params('width'),
    "height" : $input.params('height'),
    "params": $input.params(),
    "resourcePath": $context.resourcePath,
}

当从chrome rest客户端调用时,我得到:

Execution log for request test-request
Tue Sep 08 09:10:20 UTC 2015 : Starting execution for request: test-invoke-request
Tue Sep 08 09:10:20 UTC 2015 : API Key: test-invoke-api-key
Tue Sep 08 09:10:20 UTC 2015 : Method request path: {name=name, width=100, height=100}
Tue Sep 08 09:10:20 UTC 2015 : Method request query string: {}
Tue Sep 08 09:10:20 UTC 2015 : Method request headers: {}
Tue Sep 08 09:10:20 UTC 2015 : Method request body before transformations: null
Tue Sep 08 09:10:20 UTC 2015 : Endpoint request URI: <endpoint>:function:Magic/invocations
Tue Sep 08 09:10:20 UTC 2015 : Endpoint request headers: {
    Authorization=<authorization> 
    Credential=<credential>, 
    SignedHeaders=accept;content-type;host;user-agent;x-amz-content-sha256;x-amz-date;x-amz-source-arn, 
    Signature=<signature>, 
    X-Amz-Date=20150908T091020Z, 
    X-Amz-Source-Arn=<ARN>/null/GET/image/{name}/{width}/{height}, 
    Accept=application/json, 
    User-Agent=AmazonAPIGateway_ebkkwbbpo0, 
    Host=lambda.us-east-1.amazonaws.com, 
    X-Amz-Content-Sha256=<key>, 
    Content-Type=application/json
}
Tue Sep 08 09:10:20 UTC 2015 : Endpoint request body after transformations: {
    "name": name,
    "width" : 100,
    "height" : 100,
    "params": {path={name=name, width=100, height=100}, querystring={}, header={}},
    "resourcePath": /image/{name}/{width}/{height},
}
Tue Sep 08 09:10:20 UTC 2015 : Endpoint response body before transformations: {"Type":"User","message":"Could not parse request body into json."}

Tue Sep 08 09:10:20 UTC 2015 : Endpoint response headers: {
    x-amzn-ErrorType=InvalidRequestContentException:http://internal.amazon.com/coral/com.amazonaws.awsgirapi/, 
    x-amzn-RequestId=<RequestId>, 
    Connection=keep-alive, 
    Content-Length=68, 
    Date=Tue, 08 Sep 2015 09:10:20 GMT, 
    Content-Type=application/json}
Tue Sep 08 09:10:20 UTC 2015 : Method response body after transformations: {"Type":"User","message":"Could not parse request body into json."}
Tue Sep 08 09:10:20 UTC 2015 : Method response headers: {Content-Type=application/json}
Tue Sep 08 09:10:20 UTC 2015 : Successfully completed execution

共有1个答案

严书
2023-03-14

问题是集成请求映射模板。您应该在字符串类型的字段中加上双引号,这样以后就可以将它们转换为JSON。因此,在本例中,您应该这样写:

#set($inputRoot = $input.path('$'))
{
    "name": "$input.params('name')",
    "width" : $input.params('width'),
    "height" : $input.params('height'),
    "params": "$input.params()",
    "resourcePath": "$context.resourcePath",
}

我觉得很奇怪,但这就是解决办法。

此外,您不需要为此编写三个映射模板,您应该只保留application/json

 类似资料:
  • 你可以使用@RequestMapping注解来将请求URL,如/appointments等,映射到整个类上或某个特定的处理器方法上。一般来说,类级别的注解负责将一个特定(或符合某种模式)的请求路径映射到一个控制器上,同时通过方法级别的注解来细化映射,即根据特定的HTTP请求方法(“GET”“POST”方法等)、HTTP请求中是否携带特定参数等条件,将请求映射到匹配的方法上。 下面这段代码示例来自P

  • 主要内容:Servlet 单一映射,Servlet 多重映射客户端通过 URL 地址来访问 Web 服务器中的资源,Servlet 程序若想被外界访问,就必须被映射到一个 URL 地址上。很多时候,该 URL 地址和 Servlet 程序的物理路径(在硬盘上的存储位置)并不一致,因此它被称为虚拟路径。Servlet 与虚拟路径的对应关系就叫做 Servlet 虚拟路径映射。 Servlet 虚拟路径映射可以被分为 2 类: 单一映射 多重映射 下面介绍如何

  • 类似这样的东西,我不需要返回任何东西:

  • Web 容器需要本章描述的映射技术去映射客户端请求到 Servlet(该规范2.5以前的版本,使用这些映射技术是作为一个建议而不是要求,允许servlet 容器各有其不同的策略用于映射客户端请求到 servlet)。

  • https://skjdfsdj.execute-api.us-east-1.amazonaws.com/test/name/name2 在下一个示例中,它将是prod: https://skjdfsdj.execute-api.us-east-1.amazonaws.com/prod/name/name2 你知道这会怎么做吗? 谢谢,本尼

  • 引导 servlet 服务请求的请求路径由许多重要部分组成。以下元素从请求URI路径得到,并通过请求对象公开: Context Path:与ServletContext相关联的路径前缀是这个Servlet 的一部分。如果这个上下文是基于Web服务器的URL命名空间基础上的“默认”上下文,那么这个路径将是一个空字符串。否则,如果上下文不是基于服务器的命名空间,那么这个路径以“/”字符开始,但不以“/