Class AsyncHttpClient

java.lang.Object
com.ning.http.client.AsyncHttpClient
All Implemented Interfaces:
Closeable, AutoCloseable

public class AsyncHttpClient extends Object implements Closeable
This class support asynchronous and synchronous HTTP request.

To execute synchronous HTTP request, you just need to do

    AsyncHttpClient c = new AsyncHttpClient();
    Future f = c.prepareGet("http://www.ning.com/").execute();
 
</blockquote

The code above will block until the response is fully received. To execute asynchronous HTTP request, you create an AsyncHandler or its abstract implementation, AsyncCompletionHandler

       AsyncHttpClient c = new AsyncHttpClient();
       Future f = c.prepareGet("http://www.ning.com/").execute(new AsyncCompletionHandler() {
 

@Override public Response onCompleted(Response response) throws IOException { // Do something return response; }

@Override public void onThrowable(Throwable t) { } }); Response response = f.get();

// We are just interested to retrieve the status code. Future f = c.prepareGet("http://www.ning.com/").execute(new AsyncCompletionHandler() {

@Override public Integer onCompleted(Response response) throws IOException { // Do something return response.getStatusCode(); }

@Override public void onThrowable(Throwable t) { } }); Integer statusCode = f.get();

</blockquote The AsyncCompletionHandler.onCompleted(com.ning.http.client.Response) will be invoked once the http response has been fully read, which include the http headers and the response body. Note that the entire response will be buffered in memory.

You can also have more control about the how the response is asynchronously processed by using a AsyncHandler

      AsyncHttpClient c = new AsyncHttpClient();
      Future f = c.prepareGet("http://www.ning.com/").execute(new AsyncHandler() {
          private StringBuilder builder = new StringBuilder();
 

@Override public STATE onStatusReceived(HttpResponseStatus s) throws Exception { // return STATE.CONTINUE or STATE.ABORT return STATE.CONTINUE }

@Override public STATE onHeadersReceived(HttpResponseHeaders bodyPart) throws Exception { // return STATE.CONTINUE or STATE.ABORT return STATE.CONTINUE

} @Override

public STATE onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception { builder.append(new String(bodyPart)); // return STATE.CONTINUE or STATE.ABORT return STATE.CONTINUE }

@Override public String onCompleted() throws Exception { // Will be invoked once the response has been fully read or a ResponseComplete exception // has been thrown. return builder.toString(); }

@Override public void onThrowable(Throwable t) { } });

String bodyResponse = f.get();

</blockquote From any content classes, you can asynchronously process the response status,headers and body and decide when to stop the processing the response by throwing a new {link ResponseComplete} at any moment.

This class can also be used without the need of AsyncHandler

      AsyncHttpClient c = new AsyncHttpClient();
      Future f = c.prepareGet(TARGET_URL).execute();
      Response r = f.get();
 

Finally, you can configure the AsyncHttpClient using an AsyncHttpClientConfig instance

      AsyncHttpClient c = new AsyncHttpClient(new AsyncHttpClientConfig.Builder().setRequestTimeout(...).build());
      Future f = c.prepareGet(TARGET_URL).execute();
      Response r = f.get();
 

An instance of this class will cache every HTTP 1.1 connections and close them when the AsyncHttpClientConfig.getReadTimeout() expires. This object can hold many persistent connections to different host.