Twitter で @AsyncHttpClient をフォローしてください。
AsyncHttpClient (AHC) ライブラリを使用すると、Java アプリケーションで HTTP 要求を簡単に実行し、HTTP 応答を非同期的に処理できます。このライブラリは WebSocket プロトコルもサポートしています。
Netty の上に構築されています。 Java 11 でコンパイルされています。
バイナリは Maven Central にデプロイされます。メインの AsyncHttpClient アーティファクトに依存関係を追加します。
メイビン:
< dependencies >
< dependency >
< groupId >org.asynchttpclient</ groupId >
< artifactId >async-http-client</ artifactId >
< version >3.0.1</ version >
</ dependency >
</ dependencies >
グラドル:
dependencies {
implementation ' org.asynchttpclient:async-http-client:3.0.1 '
}
Dsl ヘルパーをインポートして、コンポーネントをブートストラップする便利な方法を使用します。
import static org . asynchttpclient . Dsl .*;
import static org . asynchttpclient . Dsl .*;
AsyncHttpClient asyncHttpClient = asyncHttpClient ();
AsyncHttpClient インスタンスは、使用が完了したら (通常はアプリケーションをシャットダウンするときに) 閉じる必要があります ( close
メソッドを呼び出します)。そうしないと、スレッドのハングやリソース リークが発生します。
AsyncHttpClient インスタンスは、アプリケーションと同じライフサイクルを共有するグローバル リソースであることを目的としています。通常、リクエストごとに新しいクライアントを作成すると、それぞれに新しいスレッドと接続プールが作成されるため、AHC のパフォーマンスは低下します。事前に共有リソース (EventLoop と Timer) を作成し、構成内の複数のクライアント インスタンスにそれらを渡すことができます。その後、それらの共有リソースを閉じる必要があります。
最後に、AsyncHttpClientConfig オブジェクトを介して AsyncHttpClient インスタンスを構成することもできます。
import static org . asynchttpclient . Dsl .*;
AsyncHttpClient c = asyncHttpClient ( config (). setProxyServer ( proxyServer ( "127.0.0.1" , 38080 )));
AHC は、リクエストを定義するための 2 つの API (バインドとアンバインド) を提供します。 AsyncHttpClient
と Dsl` は標準 HTTP メソッド (POST、PUT など) のメソッドを提供しますが、カスタム メソッドを渡すこともできます。
import org . asynchttpclient .*;
// bound
Future < Response > whenResponse = asyncHttpClient . prepareGet ( "http://www.example.com/" ). execute ();
// unbound
Request request = get ( "http://www.example.com/" ). build ();
Future < Response > whenResponse = asyncHttpClient . executeRequest ( request );
setBody
メソッドを使用して、リクエストに本文を追加します。
この本体のタイプは次のとおりです。
java.io.File
byte[]
List<byte[]>
String
java.nio.ByteBuffer
java.io.InputStream
Publisher<io.netty.buffer.ByteBuf>
org.asynchttpclient.request.body.generator.BodyGenerator
BodyGenerator
、その場でリクエスト本文を作成できるようにする汎用の抽象化です。リクエストのチャンクをオンザフライで渡す方法を探している場合は、 FeedableBodyGenerator
を参照してください。
addBodyPart
メソッドを使用して、マルチパート パーツをリクエストに追加します。
この部分は次のタイプになります。
ByteArrayPart
FilePart
InputStreamPart
StringPart
execute
メソッドはjava.util.concurrent.Future
を返します。呼び出しスレッドをブロックするだけで応答を取得できます。
Future < Response > whenResponse = asyncHttpClient . prepareGet ( "http://www.example.com/" ). execute ();
Response response = whenResponse . get ();
これはデバッグには便利ですが、そのようなコードを実稼働環境で実行すると、パフォーマンスが低下したり、バグが発生したりする可能性が高くなります。非ブロッキング クライアントを使用するポイントは、呼び出し元のスレッドをブロックしないことです。
実際には、 execute
メソッドは Guava と同様のorg.asynchttpclient.ListenableFuture
を返します。 Future の完了を通知されるようにリスナーを構成できます。
ListenableFuture < Response > whenResponse = ???;
Runnable callback = () - > {
try {
Response response = whenResponse . get ();
System . out . println ( response );
} catch ( InterruptedException | ExecutionException e ) {
e . printStackTrace ();
}
};
java . util . concurrent . Executor executor = ???;
whenResponse . addListener (() - > ??? , executor );
executor
パラメータが null の場合、コールバックは IO スレッドで実行されます。そこでは決してブロック操作を実行してはなりません。通常は別のリクエストを送信し、将来的にブロックします。
execute
メソッドはorg.asynchttpclient.AsyncHandler
受け取り、ステータス、ヘッダー、本文チャンクの受信など、さまざまなイベントで通知を受けることができます。指定しない場合、AHC はorg.asynchttpclient.AsyncCompletionHandler
を使用します。
AsyncHandler
メソッドを使用すると、処理を早期に中止し ( AsyncHandler.State.ABORT
を返す)、Future の結果として使用される計算結果をonCompleted
から返すことができます。例として、 AsyncCompletionHandler
の実装を参照してください。
以下のサンプルは、応答ステータスをキャプチャするだけであり、応答本文のチャンクの処理をスキップします。
ABORT
返すと、基礎となる接続が閉じられることに注意してください。
import static org . asynchttpclient . Dsl .*;
import org . asynchttpclient .*;
import io . netty . handler . codec . http . HttpHeaders ;
Future < Integer > whenStatusCode = asyncHttpClient . prepareGet ( "http://www.example.com/" )
. execute ( new AsyncHandler < Integer > () {
private Integer status ;
@ Override
public State onStatusReceived ( HttpResponseStatus responseStatus ) throws Exception {
status = responseStatus . getStatusCode ();
return State . ABORT ;
}
@ Override
public State onHeadersReceived ( HttpHeaders headers ) throws Exception {
return State . ABORT ;
}
@ Override
public State onBodyPartReceived ( HttpResponseBodyPart bodyPart ) throws Exception {
return State . ABORT ;
}
@ Override
public Integer onCompleted () throws Exception {
return status ;
}
@ Override
public void onThrowable ( Throwable t ) {
t . printStackTrace ();
}
});
Integer statusCode = whenStatusCode . get ();
ListenableFuture
は、 CompletableFuture
を返すtoCompletableFuture
メソッドがあります。このCompletableFuture
キャンセルしても、進行中のリクエストは適切にキャンセルされないことに注意してください。次のリリースでは代わりにCompletionStage
返す可能性が非常に高くなります。
CompletableFuture < Response > whenResponse = asyncHttpClient
. prepareGet ( "http://www.example.com/" )
. execute ()
. toCompletableFuture ()
. exceptionally ( t ->{ /* Something wrong happened... */ })
. thenApply ( response ->{ /* Do something with the Response */ return resp ;});
whenResponse . join (); // wait for completion
この簡単なデモの完全な Maven プロジェクトは org.asynchttpclient.example から入手できます。
非同期HTTPクライアントはWebSocketもサポートしています。 WebSocketListener
を登録するWebSocketUpgradeHandler
を渡す必要があります。
WebSocket websocket = c . prepareGet ( "ws://demos.kaazing.com/echo" )
. execute ( new WebSocketUpgradeHandler . Builder (). addWebSocketListener (
new WebSocketListener () {
@ Override
public void onOpen ( WebSocket websocket ) {
websocket . sendTextFrame ( "..." ). sendTextFrame ( "..." );
}
@ Override
public void onClose ( WebSocket websocket ) {
// ...
}
@ Override
public void onTextFrame ( String payload , boolean finalFragment , int rsv ) {
System . out . println ( payload );
}
@ Override
public void onError ( Throwable t ) {
t . printStackTrace ();
}
}). build ()). get ();
非同期 HTTP クライアント ディスカッション グループに参加して、ライブラリ開発の最新情報を入手してください。
GitHub ディスカッション