Как написать обработчик Java Lambda для веб-сокета API Gateway?

Мне трудно понять, как написать функцию Java Lambda, которая обрабатывает сообщения Websocket, где Websockets обрабатываются новой функцией шлюза API, которая была только что выпущена в конце 2018 года. Конкретные вопросы: * Какой тип следует использовать для входного объекта? В настоящее время я использую APIGatewayProxyRequestEvent. Есть ли тип, специфичный для запросов Websocket? Я не вижу его в aws-lambda-java-events-2.2.5.jar. * Если я использую правильный тип, как я могу получить доступ к идентификатору соединения? Нужно ли мне как-то использовать сопоставление API? Я видел эту ссылку, но на самом деле она не говорит вам, как выполнить сопоставление для веб-сокетов, которые, похоже, имеют другие параметры, чем REST API для такого рода вещей. https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-mapping-template-reference.html

Заранее спасибо!

открытый класс WebsocketHandler реализует RequestHandler {

@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
    context.getLogger().log("Input: " + input);
    context.getLogger().log("Context:  " + context);

    ProxyRequestContext requestContext = input.getRequestContext();
    context.getLogger().log("requestContext:  " + requestContext);

    // I don't see Connection ID in any of these

    APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
    response.setStatusCode(200);
    response.setBody("All good here.");
    return response;
}

}

Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
В этой статье мы рассмотрим, как включить доступ Java Lambda к экземпляру AWS RDS MySQL.
5
0
2 359
1

Ответы 1

Вот ответ, который я получил от службы поддержки AWS. Оно работает! Однако я еще не смог отправить обратно клиенту. Если кто-то успешно это сделал, пожалуйста, дайте мне знать. Я пытаюсь использовать AmazonHTTPClient, и мне непонятно, как правильно подписать сообщение с помощью AWS4Signer. Если кто-то успешно сделал это, пожалуйста, дайте мне знать.

В настоящее время мы не предлагаем поддержку веб-сокетов в APIGatewayProxyRequestEvent, как в REST [1]. Однако я упомянул об этом команде, которая занимается репозиторием GitHub, так что в конечном итоге они также реализуют класс для веб-сокета.

Альтернативой на данный момент является обработка ввода как потока и его синтаксический анализ с использованием любого доступного синтаксического анализатора JSON. Для начала я приложил пример проекта, который вы можете собрать с помощью "mvn package" и загрузить в Lambda. Я протестировал его лично и смог распечатать весь requestContext [2], возвращаемый шлюзом API, в виде строки. Единственная отсутствующая часть — это синтаксический анализ строки JSON.

Обратите внимание, что код, который я предоставил, взят из некоторых примеров, которые я смог собрать внутри, и он не готов к производству, он предназначен исключительно для использования в качестве шаблонного кода. Также я хочу отметить, что поддержка кода обычно выходит за рамки AWS Premium Support, поэтому я не могу гарантировать, что я или другие инженеры AWS смогут поддерживать этот код в дальнейшем. Однако я хотел предоставить вам кое-что для начала, так как я понимаю, что в нашей документации отсутствуют примеры шлюза API веб-сокетов и Java.

ОБРАЗЕЦ КОДА

package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class LambdaBasicStreamFunction implements RequestStreamHandler {
    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        int letter;
        String eventObject = "";

        while ((letter = inputStream.read()) > -1) {
            char inputChar= (char) letter;
            eventObject += inputChar;
        }

        //Passing a custom response as the output string
        String response = "{\n" +
                "    \"statusCode\": 200,\n" +
                "    \"headers\": {\"Content-Type\": \"application/json\"},\n" +
                "    \"body\": \"plain text response\"\n" +
                "}";
        outputStream.write(response.getBytes());

        System.out.println("Input-Event: " + eventObject);
    }
}

Для меня связь с клиентами работает так: }", "{регион}")).build(); Сообщение PostToConnectionRequest = new PostToConnectionRequest(); post.setConnectionId(connectionId); post.setData(ByteBuffer.wrap("сообщение".getBytes())); api.postToConnection(сообщение);`

NullPointer 05.07.2020 01:52

Всем привет ! Несколько дней назад я начал играть с AWS WebSocket API Gateway, и в настоящее время я использую карту следующим образом: обработчик открытого класса реализует RequestHandler<Map<String, Object>, String> { @Override public String handleRequest(Map<String , Объект> событие, контекст контекста) { logger.info("СОБЫТИЕ: {}", событие); } } Ввод работает очень хорошо, однако вывод я хочу настроить. Использование json в качестве строки не работает так, как я хочу. Надеюсь, это поможет вам

ryuzaki 04.04.2021 01:22

Другие вопросы по теме