Ikuti @AsyncHttpClient di Twitter.
Pustaka AsyncHttpClient (AHC) memungkinkan aplikasi Java menjalankan permintaan HTTP dengan mudah dan memproses respons HTTP secara asinkron. Perpustakaan juga mendukung Protokol WebSocket.
Itu dibangun di atas Netty. Ini dikompilasi dengan Java 11.
Biner dikerahkan di Maven Central. Tambahkan ketergantungan pada artefak AsyncHttpClient utama:
Pakar:
< dependencies >
< dependency >
< groupId >org.asynchttpclient</ groupId >
< artifactId >async-http-client</ artifactId >
< version >3.0.1</ version >
</ dependency >
</ dependencies >
Gradasi:
dependencies {
implementation ' org.asynchttpclient:async-http-client:3.0.1 '
}
Impor pembantu Dsl untuk menggunakan metode mudah untuk mem-bootstrap komponen:
import static org . asynchttpclient . Dsl .*;
import static org . asynchttpclient . Dsl .*;
AsyncHttpClient asyncHttpClient = asyncHttpClient ();
Instance AsyncHttpClient harus ditutup (panggil metode close
) setelah Anda selesai menggunakannya, biasanya saat mematikan aplikasi Anda. Jika tidak, Anda akan mengalami thread hang dan kebocoran sumber daya.
Instans AsyncHttpClient dimaksudkan untuk menjadi sumber daya global yang berbagi siklus hidup yang sama dengan aplikasi. Biasanya, AHC biasanya akan berkinerja buruk jika Anda membuat klien baru untuk setiap permintaan, karena akan membuat thread dan kumpulan koneksi baru untuk setiap permintaan. Dimungkinkan untuk membuat sumber daya bersama (EventLoop dan Timer) terlebih dahulu dan meneruskannya ke beberapa instance klien di konfigurasi. Anda kemudian akan bertanggung jawab untuk menutup sumber daya bersama tersebut.
Terakhir, Anda juga dapat mengonfigurasi instance AsyncHttpClient melalui objek AsyncHttpClientConfig:
import static org . asynchttpclient . Dsl .*;
AsyncHttpClient c = asyncHttpClient ( config (). setProxyServer ( proxyServer ( "127.0.0.1" , 38080 )));
AHC menyediakan 2 API untuk menentukan permintaan: terikat dan tidak terikat. AsyncHttpClient
dan Dsl` menyediakan metode untuk metode HTTP standar (POST, PUT, dll) tetapi Anda juga dapat meneruskan metode khusus.
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 );
Gunakan metode setBody
untuk menambahkan isi permintaan.
Tubuh ini dapat bertipe:
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
adalah abstraksi umum yang memungkinkan Anda membuat badan permintaan dengan cepat. Lihat FeedableBodyGenerator
jika Anda mencari cara untuk meneruskan potongan permintaan dengan cepat.
Gunakan metode addBodyPart
untuk menambahkan bagian multi bagian ke permintaan.
Bagian ini dapat bertipe:
ByteArrayPart
FilePart
InputStreamPart
StringPart
execute
metode mengembalikan java.util.concurrent.Future
. Anda cukup memblokir thread panggilan untuk mendapatkan respons.
Future < Response > whenResponse = asyncHttpClient . prepareGet ( "http://www.example.com/" ). execute ();
Response response = whenResponse . get ();
Ini berguna untuk debugging tetapi kemungkinan besar Anda akan merusak kinerja atau membuat bug saat menjalankan kode tersebut pada produksi. Tujuan menggunakan klien non-pemblokiran adalah untuk TIDAK MEMBLOKIR thread pemanggil!
metode execute
sebenarnya mengembalikan org.asynchttpclient.ListenableFuture
yang mirip dengan Guava. Anda dapat mengonfigurasi pendengar untuk diberi tahu tentang penyelesaian Masa Depan.
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 );
Jika parameter executor
adalah null, panggilan balik akan dieksekusi di thread IO. Anda TIDAK HARUS MELAKUKAN operasi PEMBLOKIRAN di sana, biasanya mengirimkan permintaan lain dan memblokir di masa mendatang.
metode execute
dapat memerlukan org.asynchttpclient.AsyncHandler
untuk diberitahu tentang berbagai peristiwa, seperti menerima status, header, dan potongan isi. Jika Anda tidak menentukannya, AHC akan menggunakan org.asynchttpclient.AsyncCompletionHandler
;
Metode AsyncHandler
memungkinkan Anda membatalkan pemrosesan lebih awal (mengembalikan AsyncHandler.State.ABORT
) dan memungkinkan Anda mengembalikan hasil komputasi dari onCompleted
yang akan digunakan sebagai hasil Masa Depan. Lihat implementasi AsyncCompletionHandler
sebagai contoh.
Contoh di bawah ini hanya menangkap status respons dan melewatkan pemrosesan potongan isi respons.
Perhatikan bahwa mengembalikan ABORT
akan menutup koneksi yang mendasarinya.
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
memiliki metode toCompletableFuture
yang mengembalikan CompletableFuture
. Berhati-hatilah karena membatalkan CompletableFuture
ini tidak akan membatalkan permintaan yang sedang berlangsung dengan benar. Ada kemungkinan besar kami akan mengembalikan CompletionStage
di rilis berikutnya.
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
Anda bisa mendapatkan proyek pakar lengkap untuk demo sederhana ini dari org.asynchttpclient.example
Klien Http Async juga mendukung WebSocket. Anda harus melewati WebSocketUpgradeHandler
tempat Anda akan mendaftarkan WebSocketListener
.
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 ();
Ikuti perkembangan perkembangan perpustakaan dengan bergabung dalam grup diskusi Klien HTTP Asinkron
Diskusi GitHub