Api gateway «искаженный ответ лямбда-прокси» при возврате строки из java

#java #amazon-web-services #aws-lambda #aws-api-gateway

#java #amazon-web-services #aws-lambda #aws-api-gateway

Вопрос:

 public class LambdaFunction implements RequestHandler<Map<String, Object>, String> {
    Gson gson = new GsonBuilder().create();

    @Override
    public String handleRequest(Map<String, Object> event, Context context) {
        return gson.toJson(new Response());
    }
    
    class Response {
        int statusCode;
        Map<String, String> headers;
        Map<String, String> body;
        
        public Response(){
        this.statusCode = 300;
        this.headers = new HashMap<>();
        this.body = new HashMap<>();
        this.body.put("key1", "value1");
        }
    } 
}

  

Я настроил конечную точку с интеграцией прокси для шлюза api, это заключительная часть журнала:

 Mon Sep 28 09:30:27 UTC 2020 : Received response. Status: 200, Integration latency: 16 ms
Mon Sep 28 09:30:27 UTC 2020 : Endpoint response headers: {Date=Mon, 28 Sep 2020 09:30:27 GMT, Content-Type=application/json, Content-Length=68, Connection=keep-alive, x-amzn-RequestId=string, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=string;sampled=0}
Mon Sep 28 09:30:27 UTC 2020 : Endpoint response body before transformations: "{"statusCode":300,"headers":{},"body":{"key1":"value1"}}"
Mon Sep 28 09:30:27 UTC 2020 : Execution failed due to configuration error: Malformed Lambda proxy response
Mon Sep 28 09:30:27 UTC 2020 : Method completed with status: 502
  

Я понятия не имею, что делать, я уже просмотрел много вопросов, но ни один из них не использовал java. Я также пытался вернуть ответ напрямую, и даже это не работает должным образом. Шлюз не возвращает ошибку, но возвращает 200 с пустым телом (которое должно быть 300 с телом)

Ответ №1:

Если вы не собираетесь использовать код событий Java Lambda, вам нужно убедиться, что поля в ответе правильные. Как вы можете видеть, body это просто строка:

 private Integer statusCode;
private Map<String, String> headers;
private String body;
private Boolean isBase64Encoded;
  

Ответ №2:

Просматривая официальные примеры кода, которые я нашел здесь, в классе APIGatewayProxyResponseEvent , я заставил свой собственный Response класс работать, реализовав его Serializable и сделав общедоступными методы получения. Однако я не смог заставить его работать со строкой json.