Java 11 HTTP Client 的使用简介

http://openjdk.java.net/groups/net/httpclient/intro.html
http://www.reactive-streams.org/

Java 11 引入了新的 HTTP Client 模块,来发送 HTTP Request,支持 HTT/1.1, HTTP/2。

重要接口:

接口名称 描述
HttpClient.Builder HttpClient 构建工具类,构建者模式
HttpRequest.BodyPublisher 将特定的 java 对象转换为可发送的 HTTP request body 字节流
HttpRequest.Builder HTTPReqest 构建者工具类
HttpResponse HTTP 返回结果类
HttpResponse.BodyHandler 处理接收到的 Response Body
HttpResponse.BodySubscriber 将 Response Body 字节流转换为对应的 Java 对象
HttpResponse.PushPromiseHandler A handler for push promises.
HttpResponse.ResponseInfo Initial response information supplied to a BodyHandler when a response is initially received and before the body is processed.
WebSocket WebSocket Client
WebSocket.Builder WebSocket Client 的构建者工具类
WebSocket.Listener WebSocket 数据接收接口

示例 1:发送 GET 请求并打印接收到的 Response body

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://openjdk.java.net/"))
      .build();
      
client.sendAsync(request, BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

HTTP Client 支持以异步模式发送 HTTP 请求,有前端开发经验的话,可以参照 ajax 来理解。

可以使用 HttpClient Builder 来构建 HttpClient,在调用 build() 方法之前,配置特定的 http 参数,例如:

  • 协议版本,HTTP/1.1 还是 HTTP/2
  • 是否支持重定向
  • 配置代理
  • 认证
HttpClient client = HttpClient.newBuilder()
      .version(Version.HTTP_2)
      .followRedirects(Redirect.SAME_PROTOCOL)
      .proxy(ProxySelector.of(new InetSocketAddress("www-proxy.com", 8080)))
      .authenticator(Authenticator.getDefault())
      .build();

调用 build() 方法后,得到 HttpClient 对象,可用以来发送 Http 请求。

HttpRequest 可以使用 HttpReqeust.Builder 来构建:

HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://openjdk.java.net/"))
      .timeout(Duration.ofMinutes(1))
      .header("Content-Type", "application/json")
      .POST(BodyPublishers.ofFile(Paths.get("file.json")))
      .build()
  • 设置目标 uri
  • 超时参数
  • http header 参数
  • 方法:GET,POST …

build 后的 HttpRequest 是不可修改的,但可以发送多次。

Http 请求,既可以同步发送,也可以异步发送,同步发送的接口 send() 会阻塞等待,直到请求结果返回:

HttpResponse<String> response =
      client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());

异步请求的方法 sendAsync(),不阻塞,直接返回 CompletableFuture 对象:

abstract <T> CompletableFuture<HttpResponse<T>>	sendAsync​(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler);

你可能感兴趣的:(Java)