Передача HTTP-заголовков из AWS API в лямбда-функцию

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

#java #amazon-веб-сервисы #http-заголовки #aws-lambda #aws-api-gateway

Вопрос:

Я пытаюсь получить HTTP-заголовки и детали тела в AWS Lambda-функции с помощью java, которые отправляются методом POST с использованием AWS API. На данный момент я успешно установил соединение между AWS API и AWS Lambda-функцией и могу вызвать его из шлюза API. Теперь, чтобы передать заголовки в лямбда-функцию, я выполнил все шаги перед «Обновлением лямбда-функции» отсюда. Ниже приведен мой лямбда-код:

     import com.amazonaws.Request;
    import com.amazonaws.Response;
    import com.amazonaws.services.lambda.runtime.Context;
    import com.amazonaws.services.lambda.runtime.RequestHandler;
    import com.amazonaws.services.lambda.runtime.events.S3Event;

    public class SimpleSysout implements RequestHandler<Request, String> {
        public String handleRequest(Request request, Context context) {
            System.out.println("Method = " request.getHttpMethod());
            System.out.println("Headers= " request.getHeaders().toString());
            System.out.println("Content= " request.getContent().toString());
            System.out.println("Servcie Name = " request.getServiceName().toString());
            System.out.println("Resource Path = " request.getResourcePath().toString());
            return request.toString();
        }

    }
 

Но я получаю ошибку типа

     {
      "errorMessage": "An error occurred during JSON parsing",
      "errorType": "java.lang.RuntimeException",
      "stackTrace": [],
      "cause": {
        "errorMessage": "com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.amazonaws.Request, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type informationn at [Source: lambdainternal.util.NativeMemoryAsInputStream@4dfa3a9d; line: 1, column: 1]",
        "errorType": "java.io.UncheckedIOException",
        "stackTrace": [],
        "cause": {
          "errorMessage": "Can not construct instance of com.amazonaws.Request, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type informationn at [Source: lambdainternal.util.NativeMemoryAsInputStream@4dfa3a9d; line: 1, column: 1]",
          "errorType": "com.fasterxml.jackson.databind.JsonMappingException",
          "stackTrace": [
            "com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)",
            "com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:889)",
            "com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:139)",
            "com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1511)",
            "com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1102)"
          ]
        }
      }
    }
 

Я также пытался использовать другие параметры вместо запроса, такие как события, но ни один из них не работает.

Комментарии:

1. Можете ли вы опубликовать свой шаблон сопоставления.

Ответ №1:

Что-то не так с вашим шаблоном сопоставления полезной нагрузки. Во время настройки API gateway вы можете указать, как вы хотите сопоставить запрос с событием. Есть также несколько готовых шаблонов, из которых вы можете выбрать.

Взгляните на этот документ от Amazon:

Полезная нагрузка запроса API и ответа API-шлюза — ссылка на шаблон сопоставления

Дайте мне знать, если вам понадобится дополнительная помощь.

Ответ №2:

handleRequest(InputStream входной поток, OutputStream выходной поток, контекстный контекст)

Я даю вам ссылку, где указана правильная реализация для получения ваших заголовков из JSON.

https://www.baeldung.com/aws-lambda-api-gateway