amazon-web-services - 无法通过 API Gateway 使用 POST 方法发送 JSON 数据
问题描述
我需要通过集成了 lambda 的 AWS API Gateway 访问私有 API。所以我使用DefaultRequest对象和 AWS4Signer 来签署 http 请求并点击私有 API url。
虽然,我能够点击 URL,但无法发送 JSON 数据,但在 handleRequest() 中的接收 lambda 上,我得到一个空的 JSON {}。下面是我正在使用的代码。
private static void doAswSigFour(String url, DefaultRequest<Void> request) {
AWS4Signer signer = new AWS4Signer();
signer.setRegionName(US_EAST_ONE);
signer.setServiceName(EXECUTE_API);
signer.setEndpointPrefix(url);
String accessKeyID = System.getenv(AWS_ACCESS_KEY_ID);
String secretKey = System.getenv(AWS_SECRET_ACCESS_KEY);
String sessionKey = System.getenv(AWS_SESSION_TOKEN);
BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials(accessKeyID, secretKey, sessionKey);
signer.sign(request, basicSessionCredentials);
}
private static DefaultRequest<Void> createAPIGWGetRequest(String finalUrl, String jsonString) {
DefaultRequest<Void> request = new DefaultRequest<Void>(EXECUTE_API);
request.addHeader(CONTENT_TYPE, APPLICATION_SLASH_JSON);
request.setEndpoint(URI.create(finalUrl));
request.setHttpMethod(HttpMethodName.POST);
request.setContent(new ByteArrayInputStream(jsonString.getBytes()));
return request;
}
在上面的代码中,jsonString 是我在字符串中的实际 JSON。我不确定是否有其他方式来发送数据。
编辑 1:添加调用功能代码
private static String invokeAPI(int trackerStatusAPIMaxWaitTime, DefaultRequest<Void> request) throws JsonProcessingException {
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setRequestTimeout(trackerStatusAPIMaxWaitTime);
clientConfiguration.setSocketTimeout(trackerStatusAPIMaxWaitTime);
clientConfiguration.setConnectionTimeout(trackerStatusAPIMaxWaitTime);
Response<AmazonWebServiceResponse<String>> response = new AmazonHttpClient(clientConfiguration)
.requestExecutionBuilder().request(request).errorResponseHandler(new ErrorResponseHandler())
.execute(new StringResponseHandler());
return response.getAwsResponse().getResult();
}
解决方案
推荐阅读
- java - 如何在jtable中进行自动换行?
- bootstrap-4 - 表格样式与文档示例不匹配
- android - 如何定位少于某个版本的 Android 版本
- apache-spark - 使用 Spark SQL 流时缺少 Avro 自定义标头
- git - 我怎么知道哪个 git 分支触发了我的 ADO 管道?
- r - 如何在现有 tibble 的循环中使用 if else 语句
- python - 我怎样才能只打印一个名称作为标题?
- flutter - 如何在 Flutter video_player 上流式传输视频?
- .net - 变量“A”或“B”作为变量“C”
- c++ - 文本文件在不同客户端的显示方式不同