Java HTTP client常见库

前言

每种编程语言里最常用的库恐怕是Http请求库了,如python里的requests包,nodejs里的request模块。

在Java世界里,也是百花齐放,山头林立。常用的有:

  • HttpURLConnection: 最早的JDK提供的类
  • Java 11提供的HttpClient
  • Apache HttpComponents项目中的HTTPClient
  • Square提供的OkHttpClient
  • Spring 自带的WebClient

Apache HttpComponents

该组件提供了两个核心类:

  • HttpCore: 更底层的传输处理类
  • HttpClient:基于HttpCore实现的HTTP-compliant 处理类

JDK 11+ HTTP Client使用举例

Post同步的json数据:

java 复制代码
public void invokePost() {
  
  try {
   String requestBody = prepareRequest();
   HttpClient client = HttpClient.newHttpClient();
   HttpRequest request = HttpRequest
     .newBuilder()
     .uri(URI.create("https://reqbin.com/echo/post/json"))
     .POST(HttpRequest.BodyPublishers.ofString(requestBody))
     .header("Accept", "application/json")
     .build();

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

   System.out.println(response.body());
  } catch (IOException | InterruptedException e) {
   e.printStackTrace();
  }
 }

 private String prepareRequest() throws JsonProcessingException {
  var values = new HashMap<String, String>() {
   {
    put("Id", "12345");
    put("Customer", "Roger Moose");
    put("Quantity", "3");
    put("Price","167.35");
   }
  };

  var objectMapper = new ObjectMapper();
  String requestBody = objectMapper.writeValueAsString(values);
  return requestBody;
 }

发送异步请求:

java 复制代码
public void invoke() throws URISyntaxException {
  
  HttpClient client = HttpClient.newBuilder()
      .version(Version.HTTP_2)
      .followRedirects(Redirect.NORMAL)
      .build();
  
  HttpRequest request = HttpRequest.newBuilder()
     .uri(new URI(URLConstants.URL))
     .GET()
     .header(URLConstants.API_KEY_NAME, URLConstants.API_KEY_VALUE)
     .timeout(Duration.ofSeconds(10))
     .build();
  
  
  client.sendAsync(request, BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println)
    .join();
 }

HTTP Client包装库

cVurl

cVurl is an open-source wrapper for the Java HTTP client. It is written in Java 11 and can be used with any JDK 11.0.2 or newer.

java 复制代码
public void cVurl() {
    CVurl cVurl = new CVurl();

    //POST
    Result result = cVurl.post("https://api.imgflip.com/caption_image")
        .queryParams(Map.of(
                "template_id", "112126428",
        "username", "test-user",
        "password", "123test321",
        "text0", "text0",
        "text1", "text1"
        ))
        .asObject(Result.class);

    System.out.println("CVurl POST: " + result);
}

它支持Compression、Multipart、Form data这些Java 11 HttpClient不具备的特性。

Avaje-HTTP

  • Fluid API for building URLs and payload
  • JSON marshaling using Avaje Jsonb/Jackson/Gson
  • Light Feign-style interfaces via annotation processing.
  • Request/Response Interception
  • Authorization via Basic Auth or OAuth Bearer Tokens
  • Async and sync API

个人建议

在实际项目中,设计符合自身项目需求的HTTP client接口,并基于JDK 11 HTTP client实现,独立于任何上述库。

参考链接

相关推荐
山山而川粤1 小时前
母婴用品系统|Java|SSM|JSP|
java·开发语言·后端·学习·mysql
迷失蒲公英2 小时前
XML与Go结构互转实现(序列化及反序列化)
xml·开发语言·golang
测试盐2 小时前
c++编译过程初识
开发语言·c++
赖赖赖先生3 小时前
fastadmin 框架 生成qr code 二维码图片,PHP 7.4版本
开发语言·php
字节流动3 小时前
Android Java 版本的 MSAA OpenGL ES 多重采样
android·java·opengles
玉红7773 小时前
R语言的数据类型
开发语言·后端·golang
夜斗(dou)3 小时前
node.js文件压缩包解析,反馈解析进度,解析后的文件字节正常
开发语言·javascript·node.js
觅远3 小时前
python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
开发语言·python·pdf
呜呼~225144 小时前
前后端数据交互
java·vue.js·spring boot·前端框架·intellij-idea·交互·css3
神雕杨4 小时前
node js 过滤空白行
开发语言·前端·javascript