当我调用 Elastic Search Service 对请求进行签名时,我仍然无法理解如何读取 AWS 响应的内容。看起来流在某个地方被消耗了。例如,我可以将响应内容打印为字符串的唯一方法是在 ResponseHandler 中。我正在使用 Amazon AWS Java SDK 1.11.170。
AmazonHttpClient client = new AmazonHttpClient(new ClientConfiguration());
Response<Void> response = client
.requestExecutionBuilder()
.request(request)
//.errorResponseHandler(errorHandler)
.executionContext(context)
//.execute(responseHandler)
.execute()
;
System.out.println("response = " + convertStreamToString(response.getHttpResponse().getContent()));
这段代码分解并表示:
java.io.IOException: Attempted read from closed stream.
有没有办法在请求执行后并在响应处理程序之外保持流打开?
最佳答案
最终通过阅读此找到解决方案github issue 。 我必须使用正确的响应处理程序。这是:
public class StringResponseHandler implements HttpResponseHandler<AmazonWebServiceResponse<String>> {
@Override
public AmazonWebServiceResponse<String> handle(com.amazonaws.http.HttpResponse response) throws IOException {
AmazonWebServiceResponse<String> awsResponse = new AmazonWebServiceResponse<>();
//putting response string in the result, available outside the handler
awsResponse.setResult((String) IOUtils.toString(response.getContent()));
return awsResponse;
}
@Override
public boolean needsConnectionLeftOpen() {
return false;
}
}
然后在调用者中:
AmazonHttpClient client = new AmazonHttpClient(new ClientConfiguration());
Response<AmazonWebServiceResponse<String>> response = client
.requestExecutionBuilder()
.request(request)
.executionContext(context)
.execute(new StringResponseHandler()) //note the new handler
.execute()
;
//print the result (string expected)
System.out.println("aws response result = " + response.getAwsResponse().getResult();
如果您想使用第三方库,可以使用 Jest client插入 Jest AWS signer
关于java - 避免读取消耗 AWS Response 的关闭流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45502955/