ติดตาม @AsyncHttpClient บน Twitter
ไลบรารี AsyncHttpClient (AHC) ช่วยให้แอปพลิเคชัน Java ดำเนินการคำขอ HTTP และประมวลผลการตอบสนอง HTTP แบบอะซิงโครนัสได้อย่างง่ายดาย ไลบรารียังรองรับ WebSocket Protocol อีกด้วย
มันถูกสร้างขึ้นบน 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) ไว้ล่วงหน้าแล้วส่งต่อไปยังอินสแตนซ์ไคลเอ็นต์หลายรายการในการกำหนดค่า จากนั้นคุณจะต้องรับผิดชอบในการปิดทรัพยากรที่ใช้ร่วมกันเหล่านั้น
สุดท้าย คุณยังสามารถกำหนดค่าอินสแตนซ์ AsyncHttpClient ผ่านออบเจ็กต์ AsyncHttpClientConfig ได้:
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
ส่งคืน org.asynchttpclient.ListenableFuture
จริง ๆ แล้วคล้ายกับของ Guava คุณสามารถกำหนดค่าผู้ฟังให้ได้รับแจ้งถึงความสำเร็จของอนาคตได้
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
เป็นโมฆะ การโทรกลับจะถูกดำเนินการในเธรด IO คุณ ต้องไม่ดำเนินการบล็อก ในนั้น โดยปกติแล้วจะส่งคำขออื่นและบล็อกในอนาคต
วิธี execute
สามารถใช้ org.asynchttpclient.AsyncHandler
เพื่อรับการแจ้งเตือนเกี่ยวกับเหตุการณ์ต่างๆ เช่น การรับสถานะ ส่วนหัว และส่วนเนื้อหา เมื่อคุณไม่ได้ระบุ AHC จะใช้ org.asynchttpclient.AsyncCompletionHandler
;
เมธอด AsyncHandler
ช่วยให้คุณยกเลิกการประมวลผลก่อนกำหนด (ส่งคืน AsyncHandler.State.ABORT
) และสามารถให้คุณส่งคืนผลลัพธ์การคำนวณจาก 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
มีเมธอด toCompletableFuture
ที่ส่งคืน CompletableFuture
ระวังว่าการยกเลิก 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
Async Http Client รองรับ WebSocket ด้วย คุณต้องผ่าน WebSocketUpgradeHandler
ซึ่งคุณจะลงทะเบียน 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 ();
ติดตามข่าวสารล่าสุดเกี่ยวกับการพัฒนาไลบรารีโดยเข้าร่วมกลุ่มสนทนา Asynchronous HTTP Client
การสนทนา GitHub