如何为API Gateway Websocket编写Java Lambda处理程序?

时间:2019-02-18 14:24:17

标签: aws-lambda aws-api-gateway

我很难弄清楚如何编写Java Lambda函数来处理Websocket消息,其中Websockets由即将于2018年底发布的新API Gateway函数处理。 *输入对象应使用哪种类型?我目前正在使用API​​GatewayProxyRequestEvent。是否有特定于Websocket请求的类型?我在aws-lambda-java-events-2.2.5.jar中看不到一个。 *如果我使用正确的类型,如何访问连接ID?我是否需要使用API​​映射?我看到了此链接,但实际上并没有告诉您如何为Websockets进行映射,Websockets似乎与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;
}

}

1 个答案:

答案 0 :(得分:1)

这是我从AWS Support获得的响应。有用!不过,我还无法寄回给客户。如果有人成功做到了,请告诉我。我正在尝试使用AmazonHTTPClient,但我不清楚如何使用AWS4Signer正确签名消息。如果有人成功完成此操作,请告诉我。

当前,我们不像REST [1]那样支持APIGatewayProxyRequestEvent中的Web套接字。但是,我已经在负责GitHub存储库的团队中提到了这一点,因此他们最终还将为Web套接字实现一个类。

目前,替代方法是将输入视为流,并使用任何可用的JSON解析器对其进行解析。为了让您入门,我附加了一个示例项目,您可以使用“ mvn软件包”进行构建,然后将其上传到Lambda。我已经对其进行了亲自测试,并且能够将API Gateway返回的整个requestContext [2]打印为字符串。唯一缺少的部分是JSON字符串的解析。

请注意,我提供的代码来自我能够在内部收集的一些示例,并且尚未准备好投入生产,它仅用作样板代码。我还想提到代码支持通常不在AWS Premium Support的范围之内,因此我不能保证我或其他AWS工程师将能够进一步支持此代码。但是,我想为您提供一些开始,因为我了解我们的文档缺少Web Socket 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);
    }
}