- Notifications
You must be signed in to change notification settings - Fork1.6k
Asynchronous Http and WebSocket Client library for Java
License
AsyncHttpClient/async-http-client
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Follow@AsyncHttpClient on Twitter.
The AsyncHttpClient (AHC) library allows Java applications to easily execute HTTP requests and asynchronously process HTTP responses.The library also supports the WebSocket Protocol.
It's built on top ofNetty. It's currently compiled on Java 8 but runs on Java 9 too.
Well, not really RFCs, but asI am ramping up to release a new version, I would appreciate the comments from the community. Please add an issue andlabel it RFC and I'll take a look!
@TomGranot is the current maintainer of this repository. You should feel free to reach out to him in an issue here or onTwitter for anything regarding this repository.
Binaries are deployed on Maven Central.
Import the AsyncHttpClient Bill of Materials (BOM) to add dependency management for AsyncHttpClient artifacts to your project:
<dependencyManagement> <dependencies> <dependency> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client-bom</artifactId> <version>LATEST_VERSION</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>
Add a dependency on the main AsyncHttpClient artifact:
<dependencies> <dependency> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client</artifactId> </dependency></dependencies>
Theasync-http-client-extras-* and other modules can also be added without having to specify the version for each dependency, because they are all managed via the BOM.
AHC doesn't use SEMVER, and won't.
- MAJOR = huge refactoring
- MINOR = new features and minor API changes, upgrading should require 1 hour of work to adapt sources
- FIX = no API change, just bug fixes, only those are source and binary compatible with same minor version
Check CHANGES.md for migration path between versions.
Feel free to check theJavadoc or the code for more information.
Import the Dsl helpers to use convenient methods to bootstrap components:
importstaticorg.asynchttpclient.Dsl.*;
importstaticorg.asynchttpclient.Dsl.*;AsyncHttpClientasyncHttpClient =asyncHttpClient();
AsyncHttpClient instances must be closed (call theclose method) once you're done with them, typically when shutting down your application.If you don't, you'll experience threads hanging and resource leaks.
AsyncHttpClient instances are intended to be global resources that share the same lifecycle as the application.Typically, AHC will usually underperform if you create a new client for each request, as it will create new threads and connection pools for each.It's possible to create shared resources (EventLoop and Timer) beforehand and pass them to multiple client instances in the config. You'll then be responsible for closing those shared resources.
Finally, you can also configure the AsyncHttpClient instance via its AsyncHttpClientConfig object:
importstaticorg.asynchttpclient.Dsl.*;AsyncHttpClientc =asyncHttpClient(config().setProxyServer(proxyServer("127.0.0.1",38080)));
AHC provides 2 APIs for defining requests: bound and unbound.AsyncHttpClient and Dsl` provide methods for standard HTTP methods (POST, PUT, etc) but you can also pass a custom one.
importorg.asynchttpclient.*;// boundFuture<Response>whenResponse =asyncHttpClient.prepareGet("http://www.example.com/").execute();// unboundRequestrequest =get("http://www.example.com/").build();Future<Response>whenResponse =asyncHttpClient.executeRequest(request);
Use thesetBody method to add a body to the request.
This body can be of type:
java.io.Filebyte[]List<byte[]>Stringjava.nio.ByteBufferjava.io.InputStreamPublisher<io.netty.bufferByteBuf>org.asynchttpclient.request.body.generator.BodyGenerator
BodyGenerator is a generic abstraction that let you create request bodies on the fly.Have a look atFeedableBodyGenerator if you're looking for a way to pass requests chunks on the fly.
Use theaddBodyPart method to add a multipart part to the request.
This part can be of type:
ByteArrayPartFilePartInputStreamPartStringPart
execute methods return ajava.util.concurrent.Future. You can simply block the calling thread to get the response.
Future<Response>whenResponse =asyncHttpClient.prepareGet("http://www.example.com/").execute();Responseresponse =whenResponse.get();
This is useful for debugging but you'll most likely hurt performance or create bugs when running such code on production.The point of using a non blocking client is toNOT BLOCK the calling thread!
execute methods actually return aorg.asynchttpclient.ListenableFuture similar to Guava's.You can configure listeners to be notified of the Future's completion.
ListenableFuture<Response>whenResponse = ???;Runnablecallback = () -> {try {Responseresponse =whenResponse.get();System.out.println(response);}catch (InterruptedException |ExecutionExceptione) {e.printStackTrace();}};java.util.concurrent.Executorexecutor = ???;whenResponse.addListener(() -> ???,executor);
If theexecutor parameter is null, callback will be executed in the IO thread.YouMUST NEVER PERFORM BLOCKING operations in there, typically sending another request and block on a future.
execute methods can take anorg.asynchttpclient.AsyncHandler to be notified on the different events, such as receiving the status, the headers and body chunks.When you don't specify one, AHC will use aorg.asynchttpclient.AsyncCompletionHandler;
AsyncHandler methods can let you abort processing early (returnAsyncHandler.State.ABORT) and can let you return a computation result fromonCompleted that will be used as the Future's result.SeeAsyncCompletionHandler implementation as an example.
The below sample just capture the response status and skips processing the response body chunks.
Note that returningABORT closes the underlying connection.
importstaticorg.asynchttpclient.Dsl.*;importorg.asynchttpclient.*;importio.netty.handler.codec.http.HttpHeaders;Future<Integer>whenStatusCode =asyncHttpClient.prepareGet("http://www.example.com/").execute(newAsyncHandler<Integer>() {privateIntegerstatus;@OverridepublicStateonStatusReceived(HttpResponseStatusresponseStatus)throwsException {status =responseStatus.getStatusCode();returnState.ABORT;}@OverridepublicStateonHeadersReceived(HttpHeadersheaders)throwsException {returnState.ABORT;}@OverridepublicStateonBodyPartReceived(HttpResponseBodyPartbodyPart)throwsException {returnState.ABORT;}@OverridepublicIntegeronCompleted()throwsException {returnstatus;}@OverridepublicvoidonThrowable(Throwablet) {}});IntegerstatusCode =whenStatusCode.get();
ListenableFuture has atoCompletableFuture method that returns aCompletableFuture.Beware that canceling thisCompletableFuture won't properly cancel the ongoing request.There's a very good chance we'll return aCompletionStage instead in the next release.
CompletableFuture<Response>whenResponse =asyncHttpClient .prepareGet("http://www.example.com/") .execute() .toCompletableFuture() .exceptionally(t -> {/* Something wrong happened... */ } ) .thenApply(response -> {/* Do something with the Response */returnresp; });whenResponse.join();// wait for completion
You may get the complete maven project for this simple demo fromorg.asynchttpclient.example
Async Http Client also supports WebSocket.You need to pass aWebSocketUpgradeHandler where you would register aWebSocketListener.
WebSocketwebsocket =c.prepareGet("ws://demos.kaazing.com/echo") .execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(newWebSocketListener() {@OverridepublicvoidonOpen(WebSocketwebsocket) {websocket.sendTextFrame("...").sendTextFrame("..."); }@OverridepublicvoidonClose(WebSocketwebsocket) { }@OverridepublicvoidonTextFrame(Stringpayload,booleanfinalFragment,intrsv) {System.out.println(payload); }@OverridepublicvoidonError(Throwablet) { } }).build()).get();
AsyncHttpClient has built-in support for reactive streams.
You can pass a request body as aPublisher<ByteBuf> or aReactiveStreamsBodyGenerator.
You can also pass aStreamedAsyncHandler<T> whoseonStream method will be notified with aPublisher<HttpResponseBodyPart>.
See tests in packageorg.asynchttpclient.reactivestreams for examples.
AsyncHttpClient has build in support for the WebDAV protocol.The API can be used the same way normal HTTP request are made:
RequestmkcolRequest =newRequestBuilder("MKCOL").setUrl("http://host:port/folder1").build();Responseresponse =c.executeRequest(mkcolRequest).get();
or
RequestpropFindRequest =newRequestBuilder("PROPFIND").setUrl("http://host:port").build();Responseresponse =c.executeRequest(propFindRequest,newAsyncHandler() {// ...}).get();
You can find more information on Jean-François Arcand's blog. Jean-François is the original author of this library.Code is sometimes not up-to-date but gives a pretty good idea of advanced features.
- http://web.archive.org/web/20111224171448/http://jfarcand.wordpress.com/2011/01/12/going-asynchronous-using-asynchttpclient-for-dummies/
- http://web.archive.org/web/20111224171241/http://jfarcand.wordpress.com/2010/12/21/going-asynchronous-using-asynchttpclient-the-basic/
- http://web.archive.org/web/20111224162752/http://jfarcand.wordpress.com/2011/01/04/going-asynchronous-using-asynchttpclient-the-complex/
- http://web.archive.org/web/20120218183108/http://jfarcand.wordpress.com/2011/12/21/writing-websocket-clients-using-asynchttpclient/
Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group
Of course, Pull Requests are welcome.
Here are the few rules we'd like you to respect if you do so:
- Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
- Use IntelliJ default formatting rules.
- Regarding licensing:
- You must be the original author of the code you suggest.
- You must give the copyright to "the AsyncHttpClient Project"
About
Asynchronous Http and WebSocket Client library for Java
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.