HTTP连接客户端,选 HttpClient 还是 OkHttp ?

简介: HTTP连接客户端,选 HttpClient 还是 OkHttp ?

写在前面

为什么会写这篇文章,起因于和朋友的聊天image.png这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okhttp的区别、性能比较进行搜索,没有找到想要的答案,于是就去overstackflow上看看是不是有人问过这个问题,果然不会让你失望的image.png所以从使用、性能、超时配置方面进行比较


使用

HttpClient和OkHttp一般用于调用其它服务,一般服务暴露出来的接口都为http,http常用请求类型就为GET、PUT、POST和DELETE,因此主要介绍这些请求类型的调用


HttpClient使用介绍

使用HttpClient发送请求主要分为以下几步骤:


创建 CloseableHttpClient对象或CloseableHttpAsyncClient对象,前者同步,后者为异步


创建Http请求对象


调用execute方法执行请求,如果是异步请求在执行之前需调用start方法


创建连接:

image.png该连接为同步连接

GET请求:image.png使用HttpGet表示该连接为GET请求,HttpClient调用execute方法发送GET请求

PUT请求:image.png该请求是一个创建对象的请求,需要传入一个json字符串

上传文件image.pngimage.png

OkHttp使用

使用OkHttp发送请求主要分为以下几步骤:

  • 创建OkHttpClient对象
  • 创建Request对象
  • 将Request 对象封装为Call
  • 通过Call 来执行同步或异步请求,调用execute方法同步执行,调用enqueue方法异步执行

创建连接:image.pngPOST请求:

添加对象

@Test  
public void testPost() throws IOException {  
    String api = "/api/user";  
    String url = String.format("%s%s", BASE_URL, api);  
    //请求参数  
    JSONObject json = new JSONObject();  
    json.put("name", "hetiantian");  
    RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),     String.valueOf(json));  
    Request request = new Request.Builder()  
            .url(url)  
            .post(requestBody) //post请求  
           .build();  
    final Call call = client.newCall(request);  
    Response response = call.execute();  
    System.out.println(response.body().string());  
}  

image.pngimage.png小结

OkHttp使用build模式创建对象来的更简洁一些,并且使用.post/.delete/.put/.get方法表示请求类型,不需要像HttpClient创建HttpGet、HttpPost等这些方法来创建请求类型


依赖包上,如果HttpClient需要发送异步请求、实现文件上传,需要额外的引入异步请求依赖image.png请求的取消,HttpClient使用abort方法,OkHttp使用cancel方法,都挺简单的,如果使用的是异步client,则在抛出异常时调用取消请求的方法即可


超时设置

HttpClient超时设置:

在HttpClient4.3+版本以上,超时设置通过RequestConfig进行设置image.png小结:

如果client是单例模式,HttpClient在设置超时方面来的更灵活,针对不同请求类型设置不同的超时时间,OkHttp一旦设置了超时时间,所有请求类型的超时时间也就确定


HttpClient和OkHttp性能比较

测试环境:


CPU 六核


内存 8G


windows10


每种测试用例都测试五次,排除偶然性


client连接为单例:image.png单例模式下,HttpClient的响应速度要更快一些,单位为毫秒,性能差异相差不大


非单例模式下,OkHttp的性能更好,HttpClient创建连接比较耗时,因为多数情况下这些资源都会写成单例模式,因此图一的测试结果更具有参考价值。


总结

OkHttp和HttpClient在性能和使用上不分伯仲,根据实际业务选择即可。


推荐去我的博客阅读更多:


1.Java JVM、集合、多线程、新特性系列教程


2.Spring MVC、Spring Boot、Spring Cloud 系列教程


3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程


4.Java、后端、架构、阿里巴巴等大厂最新面试题


生活很美好,明天见~


image.png


image.png


image.png

相关文章
|
22天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
【6月更文挑战第15天】Python的requests库简化了HTTP请求。安装后,使用`requests.get()`发送GET请求,检查`status_code`为200表示成功。类似地,`requests.post()`用于POST请求,需提供JSON数据和`Content-Type`头。
38 6
|
24天前
|
Java
原生Feign使用详解(HTTP客户端)(二)
原生Feign使用详解(HTTP客户端)(二)
23 1
|
24天前
|
JSON Java API
原生Feign使用详解(HTTP客户端)(一)
原生Feign使用详解(HTTP客户端)(一)
39 1
|
1月前
|
移动开发 Java
Java Socket编程 - 基于Socket实现HTTP下载客户端
Java Socket编程 - 基于Socket实现HTTP下载客户端
20 1
|
11天前
|
数据采集 Java API
Java HTTP客户端工具的演变之路
Java HTTP客户端工具的演变之路
|
13天前
|
JSON API 数据格式
curl 使用:命令行中的 HTTP 客户端
`curl` 是命令行神器,用于与服务器交互,支持HTTP、HTTPS、FTP等协议。本文教你如何用它做POST请求(-d/--data)、GET请求(-G/-d)、JSON请求(-H 'Content-Type: application/json')和文件上传(-F)。学会这些,轻松测试API、自动化任务。现在就动手试试吧!
13 0
|
19天前
|
JSON 前端开发 JavaScript
Axios是一个基于Promise的HTTP客户端
Axios是一个基于Promise的HTTP客户端
14 0
|
2月前
|
存储 缓存
ETag的值是如何在HTTP响应中传递给客户端的
ETag的值是如何在HTTP响应中传递给客户端的
|
1月前
|
JSON 安全 Java
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
27 0
|
2月前
|
Java
蓝易云 - HTTP的并发连接限制和连接线程池
这两个概念在网络编程中是相互关联的。如果并发连接数过多,而线程池的大小又不足以处理这些连接,服务器可能会变得不稳定,甚至崩溃。因此,合理地设置并发连接限制和线程池大小对于保持服务器的稳定性和高效性至关重要。
36 0