Как написать Java Lambda обработчик для API Gateway Websocket? - PullRequest
0 голосов
/ 18 февраля 2019

Мне трудно понять, как написать лямбда-функцию Java, которая обрабатывает сообщения Websocket, где Websockets обрабатывается новой функцией API Gateway, которая была выпущена только в конце 2018 года. Конкретные вопросы: * Какой типя должен использовать для объекта ввода?В настоящее время я использую APIGatewayProxyRequestEvent.Существует ли тип, специфичный для запросов Websocket?Я не вижу его в aws-lambda-java-events-2.2.5.jar.* Если я использую правильный тип, как я могу получить доступ к идентификатору соединения?Нужно ли мне как-то использовать API Mapping?Я видел эту ссылку, но на самом деле она не говорит вам, как выполнить сопоставление для веб-сокетов, которые, кажется, имеют другие параметры, чем API-интерфейсы REST для такого рода вещей.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;
}

}

1 Ответ

0 голосов
/ 28 февраля 2019

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

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

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

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

SAMPLE CODE SAMPLE

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...