zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Java11新特性之HttpClient post 带token使用

2023-03-07 09:06:31 时间

这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。

官网:https://www.runoob.com/manual/jdk11api/java.net.http/java/net/http/package-summary.html

image.png

其中Builder的引用全路径为java.net.http.HttpRequest.Builder,它是一个接口

Builder的几个属性

image.png
  • set uri 请求的uri
  • timeout() 请求超时时间,不设置则为无限
  • version() 请求首选的http版本,不设置则和HttpClient一样
  • header 设置请求头
  • headers() 一次是设置多个请求头,key,value,key,value…
  • method() 设置请求方法和请求体

HttpRequest.BodyPublisher 将一些常见的Java对象转换为字节缓冲流。

 /**
     * Returns an {@code Optional} containing the {@link BodyPublisher} set on
     * this request. If no {@code BodyPublisher} was set in the requests's
     * builder, then the {@code Optional} is empty.
     *
     * @return an {@code Optional} containing this request's {@code BodyPublisher}
     */
    public abstract Optional<BodyPublisher> bodyPublisher();

例如其可在微信小程序中将返回的Buffer转为Base64字符串

实例代码

var request = HttpRequest.newBuilder()
                .uri(URI.create("http://xxx"+PRINT_URL +"xxx" + "&admin="+ "admin"))
                .header("Content-Type", "application/json;charset=utf-8")
                .header("login-token", "xxx")
                .POST(HttpRequest.BodyPublishers.ofString(""))
                .build();
        var client = HttpClient.newHttpClient();
        System.out.println(send.body());

所请求的返回体需在body中获取,其中send中都包含响应码,请求uri等信息

image.png

同步请求

HttpResponse<String> send = client.send(request, HttpResponse.BodyHandlers.ofString());

异步请求

 CompletableFuture<HttpResponse<String>> responseCompletableFuture = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
        responseCompletableFuture.thenApply(response->response.body()).thenAccept(body -> {
            System.out.println(body);
        });