【Java网络编程】HTTP客户端 - hippowc/hippowc.github.io GitHub Wiki

HTTP客户端分类

Java 生态中,有数不清的 HTTP client lib 组件库,大体可以分为这三类

  • JDK 自带的 HttpURLConnection 标准库
  • Apache HttpComponents HttpClient, 以及基于该库的 wrapper
  • 非基于 Apache HttpComponents HttpClient, 大量重写应用层代码的 HTTP client 组件库,典型代表是 OkHttp

HttpURLConnection

使用 HttpURLConnection 发起 HTTP 请求最大的优点是不需要引入额外的依赖,但是使用起来非常繁琐,也缺乏连接池管理、域名机械控制等特性支持

使用 HttpURLConnection 发起 HTTP 请求是比较原始(low level)的,操作原语就是在打开的连接上面写请求 request 与读响应 response. 而且 HttpURLConnection 无法支持 HTTP/2. 显然,官方是知道这些问题的,因此在 Java 9 中,官方在标准库中引入了一个 high level、支持 HTTP/2 的 HttpClient.

HttpRequest request = HttpRequest.newBuilder()
  .uri(new URI("https://postman-echo.com/post"))
  .headers("Content-Type", "text/plain;charset=UTF-8")
  .POST(HttpRequest.BodyProcessor.fromString("Sample request body"))
  .build();

Apache HttpComponents HttpClient

在 Java 原生标准库不给力的情况下,Apache HttpComponents HttpClient 是最佳的 HTTP Client library 选择。但这个库当前还不支持 HTTP/2,支持 HTTP/2 的版本还处于 beta 阶段(2018.09.23),因此并不适合用于 Android APP 中使用。

OkHttp

由于当前 Apache HttpComponents HttpClient 版本并不支持 HTTP/2, 而 HTTP/2 对于移动客户端而言,无论是从握手延迟、响应延迟,还是资源开销看都有相当吸引力。因此这就给了高层次封装且支持 HTTP/2 的 http client lib 足够的生存空间。其中最典型的要数OkHttp,这个是目前比较流行的库,特别是在移动端,因为其常用的方式一般是回调,这种比较适合UI类程序用于触发响应。

unirest

是一个比较少见的类库,它是对httpclient4的一层封装,调用方式跟okhttp差不多。unirest从它的名字,可以看得出,专门为了rest服务调用而生的。

  • 它的一大特点是提供了,多种语言同样的调用语义。node/python/java/c#/ruby/oc这些常用语言都有名为unirest的库,调用语义都大同小异。
  • 另一大特点是直接集成了对json序列化和反序列化的支持,可以对json结果直接解析出对象或者是返回可操作的json对象。