【问题标题】:AWS lambda works but not GatewayAWS lambda 有效,但网关无效
【发布时间】: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贴出来吗?它是否实现了任何接口?

标签: java amazon-web-services aws-lambda


【解决方案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 上失败了两次。但是您的建议有助于提出适当的解决方案。再次感谢。

    【讨论】:

    • 如果它有助于回答您的问题,请接受我的回答;解析方法由你决定,但概念应该很清楚:)
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2021-11-05
    • 2019-05-26
    • 2013-05-05
    • 2018-03-11
    相关资源
    最近更新 更多