Próbuję utworzyć żądanie przesyłania strumieniowego HTTP "full-duplex" przy użyciu Apache HTTPClient.Apache HTTPClient Streaming żądanie HTTP POST?
W mojej pierwszej próbie, próbowałem za pomocą następującego kodu żądanie:
URL url=new URL(/* code goes here */);
HttpPost request=new HttpPost(url.toString());
request.addHeader("Connection", "close");
PipedOutputStream requestOutput=new PipedOutputStream();
PipedInputStream requestInput=new PipedInputStream(requestOutput, DEFAULT_PIPE_SIZE);
ContentType requestContentType=getContentType();
InputStreamEntity requestEntity=new InputStreamEntity(requestInput, -1, requestContentType);
request.setEntity(requestEntity);
HttpEntity responseEntity=null;
HttpResponse response=getHttpClient().execute(request); // <-- Hanging here
try {
if(response.getStatusLine().getStatusCode() != 200)
throw new IOException("Unexpected status code: "+response.getStatusLine().getStatusCode());
responseEntity = response.getEntity();
}
finally {
if(responseEntity == null)
request.abort();
}
InputStream responseInput=responseEntity.getContent();
ContentType responseContentType;
if(responseEntity.getContentType() != null)
responseContentType = ContentType.parse(responseEntity.getContentType().getValue());
else
responseContentType = DEFAULT_CONTENT_TYPE;
Reader responseStream=decode(responseInput, responseContentType);
Writer requestStream=encode(requestOutput, getContentType());
Żądanie wisi na linii wskazanej powyżej. Wygląda na to, że kod próbuje wysłać całą prośbę, zanim otrzyma odpowiedź. Z perspektywy czasu ma to sens. Jednak nie tego oczekiwałem. :)
Zamiast tego, miałem nadzieję, aby wysłać nagłówki żądania z Transfer-Encoding: chunked
, otrzyma nagłówek reakcji HTTP/1.1 200 OK
z Transfer-Encoding: chunked
nagłówku własną rękę, a potem będę mieć pełny dupleks połączenie strumieniowe HTTP do pracy.
Na szczęście mój klient HTTPClient ma innego asynchronicznego klienta opartego na systemie NIO z dobrymi przykładami użycia (np. this one). Moje pytania to:
- Czy moja interpretacja synchronicznego zachowania HTTPClient jest poprawna? Czy jest coś, co mogę zrobić, aby nadal używać (prostszego) synchronicznego HTTPClient w opisany sposób?
- Czy klient oparty na NIO czeka na wysłanie całej prośby przed uzyskaniem odpowiedzi? Czy będę w stanie przesłać żądanie narastająco i otrzymywać odpowiedź narastająco w tym samym czasie?
Jeśli HTTPClient nie obsługuje tej modalności, czy istnieje inna biblioteka klienta HTTP, która będzie? Czy powinienem planować napisanie (minimalnego) klienta HTTP, który będzie obsługiwał tę modalność?
To są dobre punkty. Akceptuję tylko 200, ponieważ jestem w trybie testowym; masz rację, że powinienem zaakceptować 2XX, by odnieść sukces. W tym drugim przypadku celem całego wdrożenia jest otrzymanie i przetworzenie odpowiedzi w czasie. – sigpwned
To nie jest powód zawieszenia programu. Wynika to z potokowego strumienia wejściowego. –