目标
取代繁琐的HttpURLConnection的请求。
HTTP Client的优势
API必须是易于使用的,包括简单的阻塞模式
必须支持通知机制如HTTP消息头收到、错误码、HTTP消息体收到
简洁的API能够支持80-90%的需求 必须支持标准和通用身份验证机制
必须能够轻松使用WebSocket
必须支持HTTP 2 必须执行与现有网络API一致的安全检查
必须对lambda表达式等新语言功能很友好
应该对嵌入式系统友好,避免永久运行的后台线程
必须支持HTTPS / TLS 满足HTTP 1.1和HTTP 2的性能要求
使用
需求:使用Http Client请求如下网址内容:
http://api.k780.com:88/?
app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json
来看一下 HTTP Client 的用法:
// 同步
// 1.创建HttpClient对象。
var client = HttpClient.newHttpClient();
// 2.创建请求对象:request,封装请求地址和请求方式get.
var request = HttpRequest.newBuilder().uri(URI.create("http://api.k780.com:88/?
app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"))
.GET().build();
// 3.使用HttpClient对象发起request请求。得到请求响应对象response
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 4.得到响应的状态码信息
System.out.println(response.statusCode());
// 5.得到响应的数据信息输出
System.out.println(response.body());
// 异步
// 1.创建HttpClient对象。
var client = HttpClient.newHttpClient();
// 2.创建请求对象:request,封装请求地址和请求方式get.
var request = HttpRequest.newBuilder().uri(URI.create("http://api.k780.com:88/?
app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"))
.GET().build();
// 3.使用HttpClient对象发起request异步请求。得到请求响应对象future
CompletableFuture<HttpResponse<String>> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
// 4.监听future对象的响应结果,并通过join方法进行异步阻塞式等待。
future.whenComplete((resp ,ex) -> {
if(ex != null ){
ex.printStackTrace();
} else{
System.out.println(resp.statusCode());
System.out.println(resp.body());
}
}).join();
// future.thenApply(t -> t.body()).thenAccept(System.out::println)