Мне трудно понять, как написать функцию 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. Оно работает! Однако я еще не смог отправить обратно клиенту. Если кто-то успешно это сделал, пожалуйста, дайте мне знать. Я пытаюсь использовать 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);
}
}
Всем привет ! Несколько дней назад я начал играть с AWS WebSocket API Gateway, и в настоящее время я использую карту следующим образом: обработчик открытого класса реализует RequestHandler<Map<String, Object>, String> { @Override public String handleRequest(Map<String , Объект> событие, контекст контекста) { logger.info("СОБЫТИЕ: {}", событие); } } Ввод работает очень хорошо, однако вывод я хочу настроить. Использование json в качестве строки не работает так, как я хочу. Надеюсь, это поможет вам
Для меня связь с клиентами работает так: }", "{регион}")).build(); Сообщение PostToConnectionRequest = new PostToConnectionRequest(); post.setConnectionId(connectionId); post.setData(ByteBuffer.wrap("сообщение".getBytes())); api.postToConnection(сообщение);`