JDK11新增Http客户端
- 官方文档: http://openjdk.java.net/jeps/321
这个功能在JDK 9中引入并在JDK 10中得到了更新,最终JDK11正式发布,支持 HTT/1.1, HTTP/2
- 常用类和接口
- HttpClient.Builder
HttpClient 构建工具类
- HttpRequest.Builder
HttpRequest 构建工具类
- HttpRequest.BodyPublisher
将java 对象转换为可发送的HTTP request body字节流, 如form表单提交
- HttpResponse.BodyHandler
处理理接收到的 Response Body
- 创建HttpClient, 下面结果是一致的底层调用
//var httpClient = HttpClient.newBuilder().build();
var httpClient = HttpClient.newHttpClient();
- 创建get请求
//private static final String targetUrl =
"http://api.vincent.net/pub/api/v1/web/all_category";
private static final URI uri = URI.create(targetUrl);
//GET请求
private static void testGet() {
//var httpClient = HttpClient.newHttpClient();
//设置建立连接超时 connect timeout
var httpClient =
HttpClient.newBuilder().connectTimeout(Duration.ofMillis(5000)).build();
//设置读取数据超时 read timeout
var request =
HttpRequest.newBuilder().timeout(Duration.ofMillis(3000))
.header("key1", "v1")
.header("key2", "v2")
.uri(uri).build();
try {
var response = httpClient.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
JDK11新增Http客户端提交post请求和异步请求
- 使用HttpClient提交Post请求
private static final String targetUrl
= "https://api.vincent.net/pub/api/v1/web/web_login";
private static final URI uri = URI.create(targetUrl);
//POST请求
private static void testPost() {
var httpClient = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(uri)
//json格式则使用下面数据
//.header("Content-Type", "application/json")
//.POST(HttpRequest.BodyPublishers.ofString("
{
\
"phone\":\"13113777337\",\"pwd\":\"1234567890\"}"))
//form表单则使用下面配置
.header("Content-Type", "application/x-www-form-
urlencoded ")
.POST(HttpRequest.BodyPublishers.ofString("phone=13113777337&pwd=1234567
890 "))
.build();
try {
var response = httpClient.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
- 使用HttpClient提交异步GET请求
//异步GET请求
//private static final String targetUrl =
"http://api.vincent.net/pub/api/v1/web/all_category";
private static final URI uri = URI.create(targetUrl);
//异步请求通过CompletableFuture实现。
private static void testAsynGet() {
var httpClient = HttpClient.newBuilder().build();
var request =
HttpRequest.newBuilder().timeout(Duration.ofMillis(3000))
.header("key1", "v1")
.header("key2", "v2")
.uri(uri).build();
try {
//CompletableFuture<String> result = httpClient.sendAsync(request,
//HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body);
var result = httpClient.sendAsync(request,HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body);
System.out.println(result.get());
} catch (Exception e) {
e.printStackTrace();
}
}
JDK11新增Http客户端提交http2请求
- HTTP2 百科
HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合作共事性测试。在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698允许域名管理员不通过第三方CA自行发行证书
- HTTP2协议的强制要求https,如果目标URI是HTTP的,则无法使⽤用HTTP 2协议
- 如何判断网站是否是http2协议,浏览器器,network面板,选择protocol
private static final String targetUrl = "https://http2.akamai.com/demo";
private static final URI uri = URI.create(targetUrl);
private static void testHttp2() {
var httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofMillis(3000))
.version(HttpClient.Version.HTTP_2)
.build();
var request = HttpRequest.newBuilder()
.timeout(Duration.ofMillis(3000))
.header("key1", "v1")
.header("key2", "v2")
.uri(uri)
.build();
try {
var response = httpClient.send(request,HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
System.out.println(response.version());
} catch (Exception e) {
e.printStackTrace();
}
}
java编译运行命令在jdk11中的改善
- jdk11前运行java程序
- 编译
javac xxx.java
- 运行
java xxx
- jdk11后运行java程序(本地不会生成class文件)
java xxxx.java