Aws lambda 如何为API网关Websocket编写Java Lambda处理程序?

Aws lambda 如何为API网关Websocket编写Java Lambda处理程序?,aws-lambda,aws-api-gateway,Aws Lambda,Aws Api Gateway,我很难理解如何编写一个Java Lambda函数来处理Websocket消息,而Websocket是由2018年底刚刚发布的新API网关函数处理的。具体问题: *输入对象应该使用什么类型?我当前正在使用APIGatewayProxyRequestEvent。是否存在特定于Websocket请求的类型?我在aws-lambda-java-events-2.2.5.jar中没有看到。 *如果使用正确的类型,如何访问连接ID?我是否需要使用API映射?我看到了这个链接,但它实际上并没有告诉您如何为We

我很难理解如何编写一个Java Lambda函数来处理Websocket消息,而Websocket是由2018年底刚刚发布的新API网关函数处理的。具体问题: *输入对象应该使用什么类型?我当前正在使用APIGatewayProxyRequestEvent。是否存在特定于Websocket请求的类型?我在aws-lambda-java-events-2.2.5.jar中没有看到。 *如果使用正确的类型,如何访问连接ID?我是否需要使用API映射?我看到了这个链接,但它实际上并没有告诉您如何为WebSocket进行映射,对于这类事情,WebSocket似乎有不同于RESTAPI的选项

提前谢谢

公共类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中不提供对web套接字的支持,正如我们在REST中所做的那样[1]。不过,我已经向负责GitHub存储库的团队提到了这一点,因此他们最终也将实现一个web套接字类

目前,另一种选择是将输入视为流,并使用任何可用的JSON解析器对其进行解析。为了让您开始,我附上了一个示例项目,您可以使用“mvn包”构建该项目并将其上载到Lambda。我亲自测试了它,并且能够将API网关返回的整个requestContext[2]打印为字符串。唯一缺少的部分是JSON字符串的解析

请注意,我提供的代码来自我能够在内部收集的一些示例,它还没有准备好用于生产,它只是用作样板代码。另外,我想提到的是,代码支持通常不在AWS高级支持的范围内,因此我不能保证我或其他AWS工程师能够进一步支持此代码。然而,我想为您提供一些开始的东西,因为我知道我们的文档缺少Web套接字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);
    }
}

对我来说,与客户端的通信是这样工作的:`AmazonApiGatewayManagementApi=AmazonApiGatewayManagementApiClientBuilder.standard().withEndpointConfiguration(新的EndpointConfiguration({api id}.execute api.{region}.amazonaws.com/{stage},“{region}”)).build();PostToConnectionRequest post=新的PostToConnectionRequest();post.setConnectionId(connectionId);setData(ByteBuffer.wrap(“消息”.getBytes());api.后连接(post)`你好!几天前,我开始使用AWS WebSocket API网关,目前我正在使用一个映射,如下所示:公共类处理程序实现RequestHandler{@Override public String handleRequest(映射事件,上下文上下文){logger.info(“event:{}”,event);}}输入效果很好,然而,输出是我想要定制的。使用json作为字符串并不能像我希望的那样工作。希望它能帮助你