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<String, String>
时它工作正常,我在使用 AWS Lambda 时得到了我想要的。但是当我尝试使用 AWS Gateway 调用它时,Map
就位,我得到了
"message" : "Internal server error"
检查日志时,我可以看到解析有问题。所以基本上AWS网关无法解析Map<String, String>
。
有人可以告诉我,我对 lambda 和网关有什么不了解的地方吗?为什么这些工具在解析简单 JSON 时会出现这样的问题?我该怎么办?
附言。在使用Map<String, String>
时,我也遇到了第一种方法的解析问题,这就是我决定使用JSONObject
的原因,这解决了第一种方法的问题。
【问题讨论】:
您使用的是代理集成还是非代理集成? @ErmiyaEskandary 非代理 您指定的方法请求有效负载是什么?你有什么规定吗? 我没有指定请求。我正在发送简单的 json 对象。 你能把你的整个Handler
贴出来吗?它是否实现了任何接口?
【参考方案1】:
如果不能使用Map<String, Object>
,请实现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 内容类型的二进制数据
带有 Cognito 的 AWS Lambda API 网关 - 如何使用 IdentityId 访问和更新 UserPool 属性?