2017-08-04 1 views
1

Ich kann immer noch nicht verstehen, wie der Inhalt einer AWS-Antwort gelesen wird, während ich den Elastic Search Service unterzeichne, der die Anforderungen signiert. Es scheint, als ob der Stream irgendwo verbraucht wird. Der einzige Weg, wie ich zum Beispiel den Inhalt der Antwort als String ausgeben kann, ist in einem ResponseHandler. Ich verwende Amazon AWS Java SDK 1.11.170.Vermeiden Sie es, den geschlossenen Stream zu lesen, der AWS verarbeitet Antwort

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())); 

Dieser Code setzt sich und sagt:

java.io.IOException: Attempted read from closed stream. 

Gibt es eine Möglichkeit, den Strom zu öffnen, nachdem der Anforderungsausführungs und außerhalb der Antworthandler zu halten?

+0

Was AWS-Service werden Sie mit ? IMO verwenden Sie eine sehr Low-Level-Bibliothek und sollten lieber das Service-spezifische SDK verwenden, das AWS bereitstellt. –

+0

Aufruf des Elastic Search Service, der leider keinen Java Client hat, also verwende ich grundsätzlich einen einfachen AmazonHttpClient. Jedenfalls habe ich diese Details zu meiner Frage hinzugefügt, danke! – koopa

Antwort

1

Schließlich fand die Lösung durch diese github issue. Ich musste den richtigen Antworthandler verwenden. Hier ist sie:

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; 
    } 

} 

Und dann in dem Anrufer:

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(); 

Wenn Sie mit Dritten Libs gehen wollen, können Sie Jest client mit Jest AWS signer gesteckt verwenden

Verwandte Themen