Joe*_*ell 5 aws-lambda aws-api-gateway
我很难弄清楚如何编写处理 Websocket 消息的 Java Lambda 函数,其中 Websocket 由 2018 年底刚刚发布的新 API 网关函数处理。具体问题: * 我应该使用什么类型对于输入对象?我目前正在使用 APIGatewayProxyRequestEvent。是否有特定于 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;
}
Run Code Online (Sandbox Code Playgroud)
}
以下是我从 AWS Support 收到的回复。有用!不过我还没有能够发回给客户。如果有人成功做到了这一点,请告诉我。我正在尝试使用 AmazonHTTPClient,但我不清楚如何使用 AWS4Signer 正确签署消息。如果有人成功地做到了这一点,请告诉我。
目前,我们不像 REST [1] 那样在 APIGatewayProxyRequestEvent 中提供对 Web 套接字的支持。不过,我已经向负责 GitHub 存储库的团队提到了这一点,因此他们最终也会实现一个用于 Web 套接字的类。
目前,另一种方法是将输入视为流并使用任何可用的 JSON 解析器对其进行解析。为了帮助您入门,我附上了一个示例项目,您可以使用“mvn package”构建该项目并将其上传到 Lambda。我亲自对其进行了测试,并且能够将 API Gateway 返回的整个 requestContext [2] 作为字符串打印出来。唯一缺少的部分是 JSON 字符串的解析。
请注意,我提供的代码来自我在内部收集的一些示例,它尚未准备好用于生产,它仅用作样板代码。另外我想提一下,代码支持通常超出了 AWS 高级支持的范围,因此我不能保证我或其他 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2063 次 |
| 最近记录: |