AWS lambda 有效,但网关无效

Posted

技术标签:

【中文标题】AWS lambda 有效,但网关无效【英文标题】:AWS lambda works but not Gateway 【发布时间】:2021-12-12 20:21:18 【问题描述】:

一开始我想提一下,我刚刚开始学习 AWS 工具。

我有两个用 Java 创建的请求处理程序。它们都具有相同的handleRequest 方法,如下所示

public class SecondHandler implements RequestHandler<JSONObject, List<Candidate>> 
 

    @Override
    public List<Object> handleRequest(JSONObject request, Context context) 
        List<Object> objectList = new ArrayList<>();
        System.out.println(request + " <<");
         String isActive = String.valueOf(request.getString("isActive"));        
        
        if(!isActive) return objectList;

        for(Object obj : objectList) 
          // here will go logic
        

      
        return objectList;
    

第一种方法用于返回一些对象列表,而不向它发送任何参数。当使用 AWS lambda 调用它以及使用 AWS 网关时,它工作正常。

我试图调用的第二种方法是发送 JSONObject,其中包含一个类似的文件


  "isActive" : "yes"

但是当我进行测试时,我收到错误"JSONObject[\"isActive\"] not found."。而且我确信这与我的 JSONObject request 参数有关,因为当我将其类型更改为 Map&lt;String, String&gt; 时它工作正常,我在使用 AWS Lambda 时得到了我想要的。但是当我尝试使用 AWS Gateway 调用它时,Map 就位,我得到了

 "message" : "Internal server error" 

检查日志时,我可以看到解析有问题。所以基本上AWS网关无法解析Map&lt;String, String&gt;

有人可以告诉我,我对 lambda 和网关有什么不了解的地方吗?为什么这些工具在解析简单 JSON 时会出现这样的问题?我该怎么办?

附言。在使用Map&lt;String, String&gt; 时,我也遇到了第一种方法的解析问题,这就是我决定使用JSONObject 的原因,这解决了第一种方法的问题。

【问题讨论】:

您使用的是代理集成还是非代理集成? @ErmiyaEskandary 非代理 您指定的方法请求有效负载是什么?你有什么规定吗? 我没有指定请求。我正在发送简单的 json 对象。 你能把你的整个Handler贴出来吗?它是否实现了任何接口? 【参考方案1】:

如果不能使用Map&lt;String, Object&gt;,请实现RequestStreamHandler接口。

它不需要数据类型,会为您提供InputStream。然后,您可以将流转换为任何兼容的数据类型,包括JSONObject

试试这个:

public class SecondHandler implements RequestStreamHandler 

    @Override
    public void handleRequest(InputStream input, OutputStream output, Context context) 
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        JsonElement eventElement = new JsonParser().parse(reader);
        JsonObject event = (JsonObject) eventElement;
        ...
    

【讨论】:

【参考方案2】:

感谢@Ermiya Eskandary 的帮助。你帮我弄清楚我的处理程序应该如下所示。


import org.json.JSONObject;
import org.json.JSONTokener;

public class SecondHandler 

  public void handleRequest(InputStream input, Context context) 
    BufferedReader bufferedReader = new BufferedReader(new 
    InputStreamReader(input));
    JSONTokener tokener = new JSONTokener(bufferedReader);
    JSONObject json = new JSONObject(tokener);

    // and in here I can use my json 
  

我正在尝试使用您的方法,但new JsonPArser().parse(reader); 不确定您在那里使用的是什么库。我在 Gson 和 Jackson 上失败了两次。但是您的建议有助于提出适当的解决方案。再次感谢。

【讨论】:

如果它有助于回答您的问题,请接受我的回答;解析方法由你决定,但概念应该很清楚:)

以上是关于AWS lambda 有效,但网关无效的主要内容,如果未能解决你的问题,请参考以下文章

Twitter CRC Challenge 不适用于 AWS Lambda/API 网关

配置 aws lambda 和 api 网关以返回 image/avif 内容类型的二进制数据

AWS Lambda + NAT 网关的替代方案

带有 Cognito 的 AWS Lambda API 网关 - 如何使用 IdentityId 访问和更新 UserPool 属性?

调用 AWS Lambda Java 函数的 AWS 网关收到空正文

AWS - 从公共 API 网关到 VPC 内 lambda 的路由