JDK11 新特性

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值