从 com.amazonaws.Response 到 JSON 字符串中提取响应主体的最佳方法是什么
Whats the best way to extract response body from com.amazonaws.Response to JSON string
我正在发送以下 Sig4 请求:
Response response = new AmazonHttpClient(new ClientConfiguration())
.requestExecutionBuilder()
.executionContext(new ExecutionContext(true))
.request(request)
.errorResponseHandler(new AWSErrorResponseHandler(false))
.execute(new AWSResponseHandler(false));
然后我将响应转换为 httpResponse:(不确定是否需要)
com.amazonaws.http.HttpResponse httpResponse = response.getHttpResponse();
我的问题是我无法找到有关如何提取实际 JSON 响应的简单说明
从我的回复中删除。
编辑:请注意,当我遵循 SDK 文档并尝试将内容提取为输入流时:
IOUtils.toString(response.getHttpResponse().getContent());
我得到以下异常:
java.io.IOException: Attempted read from closed stream.
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:165)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:135)
at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:90)
at com.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:180)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:106)
at com.amazonaws.util.IOUtils.toByteArray(IOUtils.java:44)
at com.amazonaws.util.IOUtils.toString(IOUtils.java:58)
任何助手都将不胜感激:)
对于 HTTP 响应,我使用了 RestAssured。有了这个它应该像这样工作:
Response response = new AmazonHttpClient().execute() // build and run your query
String json = response.getBody().prettyPrint();
如果您想在代码中直接使用 json 的信息,我建议您创建一个 POJO,然后执行以下操作:
AmazonResponseDto dto = response.as(AmazonResponseDto.class)
快速查看 com.amazonaws.http.HttpResponse 文档告诉我,您可以从中获取 InputStream,但不能直接获取 json。
我不知道您在第一个代码块中使用的 Response 包,这就是我推荐 RestAssured 的原因。
我找到了问题的原因。正如一些人所建议的那样,响应是一个输入流,但是当我试图将其提取到开始时,我要么得到一个关闭的连接异常,要么什么都没有。要解决这个问题,我必须更改 .execute(new AWSResponseHandler(true));为 true 而不是 false 以保持连接打开。 AWSResponseHandler 实施 HttpResponseHandler 并设置以下内容:
public AWSResponseHandler(boolean connectionLeftOpen) {
this.needsConnectionLeftOpen = connectionLeftOpen;
}
我希望这对遇到类似情况的任何人有所帮助。
我正在发送以下 Sig4 请求:
Response response = new AmazonHttpClient(new ClientConfiguration())
.requestExecutionBuilder()
.executionContext(new ExecutionContext(true))
.request(request)
.errorResponseHandler(new AWSErrorResponseHandler(false))
.execute(new AWSResponseHandler(false));
然后我将响应转换为 httpResponse:(不确定是否需要)
com.amazonaws.http.HttpResponse httpResponse = response.getHttpResponse();
我的问题是我无法找到有关如何提取实际 JSON 响应的简单说明 从我的回复中删除。
编辑:请注意,当我遵循 SDK 文档并尝试将内容提取为输入流时:
IOUtils.toString(response.getHttpResponse().getContent());
我得到以下异常:
java.io.IOException: Attempted read from closed stream.
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:165)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:135)
at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:90)
at com.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:180)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:106)
at com.amazonaws.util.IOUtils.toByteArray(IOUtils.java:44)
at com.amazonaws.util.IOUtils.toString(IOUtils.java:58)
任何助手都将不胜感激:)
对于 HTTP 响应,我使用了 RestAssured。有了这个它应该像这样工作:
Response response = new AmazonHttpClient().execute() // build and run your query
String json = response.getBody().prettyPrint();
如果您想在代码中直接使用 json 的信息,我建议您创建一个 POJO,然后执行以下操作:
AmazonResponseDto dto = response.as(AmazonResponseDto.class)
快速查看 com.amazonaws.http.HttpResponse 文档告诉我,您可以从中获取 InputStream,但不能直接获取 json。 我不知道您在第一个代码块中使用的 Response 包,这就是我推荐 RestAssured 的原因。
我找到了问题的原因。正如一些人所建议的那样,响应是一个输入流,但是当我试图将其提取到开始时,我要么得到一个关闭的连接异常,要么什么都没有。要解决这个问题,我必须更改 .execute(new AWSResponseHandler(true));为 true 而不是 false 以保持连接打开。 AWSResponseHandler 实施 HttpResponseHandler 并设置以下内容:
public AWSResponseHandler(boolean connectionLeftOpen) {
this.needsConnectionLeftOpen = connectionLeftOpen;
}
我希望这对遇到类似情况的任何人有所帮助。