JDK11的新特性:新的HTTP API

简介

JDK11之前,java的HTTP功能很弱,只提供了HttpURLConnection来进行HTTP连接,并且使用起来非常复杂。所以一般大家都是用第三方的HTTP client(Apache HttpComponents 或者 OkHttp)来进行HTTP请求。

一切在JDK11的时候完全变了,在java.net.http包,最新的HttpClient, HttpRequest 和 HttpResponse完全可以满足你的需求。

更多内容请访问www.flydean.com

使用HTTP Client请求的基本流程

通常我们要在代码中做一个HTTP请求,通常有三个步骤。

  1. 构建一个HTTP client。
  2. 生成一个HTTP Request。
  3. 使用HTTP Client发送HTTP Request得到一个HTTP Response。

创建HTTP Client

做HTTP请求,需要建立一个HTTP客户端和HTTP server之间的连接,HTTP协议是非常复杂的,有很多可控的参数。所以需要有一个HttpClient来进行相关的配置。

        HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(5))
.followRedirects(HttpClient.Redirect.ALWAYS)
.build();

创建HttpClient很简单,使用newBuilder就可以了,我们可以指定version,connectTimeout,proxy,SSL,认证或者cookie等。

创建HTTP Request

同样的,使用HttpRequest.newBuilder()就可以用来创建HTTP Request。

HttpRequest getRequest = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://www.flydean.com"))
.header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36")
.build();

上面的例子我们创建了一个get请求,并设置了请求的url和head。

如果是post请求,则需要构建一个request body:

HttpRequest.BodyPublisher requestBody = HttpRequest.BodyPublishers
.ofString("{ 我是body }");
HttpRequest postRequest = HttpRequest.newBuilder()
.POST(requestBody)
.uri(URI.create("http://www.flydean.com"))
.build();

发送HTTP请求

有了client和request,我们就可以发送HTTP请求了。

HttpResponse<String> response = client.send( getRequest, HttpResponse.BodyHandlers.ofString());
String respnseBody = response.body();
log.info(respnseBody);

这样一个完美的HTTP请求就完成了。

异步HTTP请求

上面的例子我们使用client.send来发送http请求,这个请求实际上是同步的,这意味着我们的程序必须一直等待,直到返回请求结果。

HttpClient还提供了一个sendAsync的异步执行的方法。该方法返回一个CompletableFuture。

还是看个例子:

    public void useAsyncHttp()  {
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(5))
.followRedirects(HttpClient.Redirect.ALWAYS)
.build(); CompletableFuture<Void> completableFuture=checkUri(client,URI.create("http://www.flydean.com"));
//获取completableFuture的值
completableFuture.join();
} private CompletableFuture<Void> checkUri(HttpClient httpClient, URI uri){
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(uri)
.header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36")
.build(); return httpClient.sendAsync(request,HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::statusCode)
.thenApply(statusCode -> statusCode == 200 )
.exceptionally(ex -> false)
.thenAccept(valid ->
{
if (valid) {
log.info("uri {} is valid",uri);
} else {
log.info("uri {} is not valid", uri);
}
});
}

上面的例子中我们获取了HTTP请求,然后调用了CompletableFuture的thenApply和thenAccept对结果进行过滤和处理。

CompletableFuture是Future和CompletionStage的混合体。Future大家都很熟悉了,可以通过get方法获取异步执行的结果。而CompletionStage代表的是一个异步计算的stage,不同的stage可以互相依赖,通过then***方法来组成一个级联操作。和Stream的操作有点像,和ES6中的promise的then一样,使用CompletionStage可以避免回调地狱。CompletionStage可以将异步回调转换成级联操作。

关于CompletableFuture的更多内容,可以参考关于CompletableFuture的一切,看这篇文章就够了

thenApply的参数是一个Function,thenAccept是一个Consumer。

最后,我们需要调用completableFuture.join()来保证completableFuture的异步操作执行完成。

当然调用completableFuture.get()方法也是可以的。

总结

本文讲解了JDK12新创建的HTTP Client操作,并进一步讨论了CompletableFuture的使用。

本文的例子https://github.com/ddean2009/

learn-java-base-9-to-20

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/jdk11-http-api/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

JDK11的新特性:新的HTTP API的更多相关文章

  1. Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能

    Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能 1. MySQL  5.6    5 大新特性1 1.1. 优化器的改进1 1.2. InnoDB 改进1 1.3. 使用 ...

  2. Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc

    Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc 1.1. Visual Studio2 1.2. ...

  3. Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能

    Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能 1. MySQL  5.6    5 大新特性1 1.1. 优化器的改进1 1.2. InnoDB 改进1 1.3. 使用 ...

  4. 重新想象 Windows 8.1 Store Apps (88) - 通信的新特性: 新的 HttpClient

    [源码下载] 重新想象 Windows 8.1 Store Apps (88) - 通信的新特性: 新的 HttpClient 作者:webabcd 介绍重新想象 Windows 8.1 Store ...

  5. Atitit.linux 内核 新特性 新功能

    Atitit.linux 内核 新特性 新功能 1.  Linux 3.2内核新特性 2012-02-12 22:41:471 1.1. EXT4:支持更大的块2 1.2. BTRFS:更快的数据清理 ...

  6. Java11新特性 - 新加一些实用的API

    1. 新的本机不可修改集合API 自从Java9开始,JDK里面为集合(List/Set/Map)都添加了of和copyOf方法,他们可以来创建不可变的集合. Question1:什么叫做不可变集合? ...

  7. iOS10 新特性-新功能,以及ReplayKit库

    iOS的10.0 本文总结了iOS的10,运行于目前推出iOS设备推出的主要开发者相关的功能. iOS版10引入了新的方法来增加您的应用程序通过帮助系统参与在适当的时候建议你的应用程序给用户.如果你在 ...

  8. webpack4.x配置详解,多页面,多入口,多出口,新特性新坑!!

    花了差不多一天多的时间,重新撸了一遍webpack4.x的常用配置. 基本上常用的配置都熟悉了一遍,总体上来讲,为了对parcel进行反击,webpack从4.x开始,正在朝着尽可能的简化配置文件的方 ...

  9. Java8新特性——新一套时间API的使用

    JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了.而Calendar并不比Date好多少.它们面临的问题是: 可变性: ...

  10. Java8新特性之三:Stream API

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

随机推荐

  1. jupyter notebook更改默认工作目录

    jupyter notebook默认配置路径:C:\Users\Administrator\.jupyter\jupyter_notebook_config.py 如果找不到配置文件,可以生成一个 j ...

  2. 我的第一个项目(十五) :完成数据保存功能(后端,改update)

    好家伙,   代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: ...

  3. Nebula Graph 源码解读系列 | Vol.04 基于 RBO 的 Optimizer 实现

    上篇我们讲述了一个执行计划是如何生成的,这次我们来看下这个生成的执行计划是被 Optimizer 优化的. 概述 Optimizer,优化器,顾名思义就是一个用来优化执行计划的组件.数据库的优化器通常 ...

  4. Java 常用类 于 StringBuffer 和 StringBuilder的使用 + String三者的异同

    1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 /** 6 * 关于 StringBuffer 和 StringB ...

  5. C++ //常用算术生成算法 //#include<numeric> accumulate //fill //向容器中填充指定的元素

    1 //常用算术生成算法 //#include<numeric> accumulate 2 //fill //向容器中填充指定的元素 3 #include<iostream> ...

  6. GitHub访问地址映射更新的时候刷新DNS

    1.windows系统 上设置地址映射 Window系统本地可以安装 Git Bash 方便本地管理仓,或下载Git 上的代码,在访问Git的时候经常出现Git访问主页加载不了等问题.需要设置在本地设 ...

  7. sort自定义排序字符串('1-1','2-1','3-2'此类)

    对数组排序 ['2-3','2-1','1-4','3-2','1-1','2-2','3-1'] 直接使用原生sort 对对象排序 [{a:'2-3'},{a:'2-1'},{a:'1-4'},{a ...

  8. vscode 快速重新启动 reload Window

    vscode 快速重新启动 reload Window ctrl + shift + P 输入 reload

  9. day10-面向对象

    面向对象 1.什么是面向对象? 1.1面向过程&&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么-- 面对过程适合处理一些较为简单地问题 面向对象思想 物以类聚,分 ...

  10. 杂谈之WEB前端工程师身价

    了解javascript语言规范么?+1000 知道各浏览器的css差异么?+1000 javascript差异呢?+1000 知道html各标签的含义并很好地运用么?+1000 知道如何跨浏览器解决 ...