httpclient 设置超时时间_选择HttpClient还是OkHttp?
写在前面
为什么会写这篇文章,起因于和朋友的聊天
这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okhttp的区别、性能比较进行搜索,没有找到想要
的答案,于是就去overstackflow上看看是不是有人问过这个问题,果然不会让你失望的
所以从使用、性能、超时配置方面进行比较
使用
HttpClient和OkHttp一般用于调用其它服务,一般服务暴露出来的接口都为http,http常用请求类型就为GET、PUT、POST和DELETE,因此主要介绍这些请求类型的调用
HttpClient使用介绍
使用HttpClient发送请求主要分为一下几步骤:
-
创建 CloseableHttpClient对象或CloseableHttpAsyncClient对象,前者同步,后者为异步
-
创建Http请求对象
-
调用execute方法执行请求,如果是异步请求在执行之前需调用start方法
创建连接:
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
该连接为同步连接
GET请求:
@Testpublic void testGet() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpGet); System.out.println(EntityUtils.toString(response.getEntity()));}
使用HttpGet表示该连接为GET请求,HttpClient调用execute方法发送GET请求
PUT请求:
@Testpublic void testPut() throws IOException { String api = "/api/user"; String url = String.format("%s%s", BASE_URL, api); HttpPut httpPut = new HttpPut(url); UserVO userVO = UserVO.builder().name("h2t").id(16L).build(); httpPut.setHeader("Content-Type", "application/json;charset=utf8"); httpPut.setEntity(new StringEntity(JSONObject.toJSONString(userVO), "UTF-8")); CloseableHttpResponse response = httpClient.execute(httpPut); System.out.println(EntityUtils.toString(response.getEntity()));}
POST请求:
- 添加对象
- @Testpublic void testPost() throws IOException { String api = "/api/user"; String url = String.format("%s%s", BASE_URL, api); HttpPost httpPost = new HttpPost(url); UserVO userVO = UserVO.builder().name("h2t2").build(); httpPost.setHeader("Content-Type", "application/json;charset=utf8"); httpPost.setEntity(new StringEntity(JSONObject.toJSONString(userVO), "UTF-8")); CloseableHttpResponse response = httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity()));
该请求是一个创建对象的请求,需要传入一个json字符串
上传文件
@Testpublic void testUpload1() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); HttpPost httpPost = new HttpPost(url); File file = new File("C:/Users/hetiantian/Desktop/学习/docker_practice.pdf"); FileBody fileBody = new FileBody(file); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("file", fileBody); //addPart上传文件 HttpEntity entity = builder.build(); httpPost.setEntity(entity); CloseableHttpResponse response = httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity()));}
通过addPart上传文件
DELETE请求:
@Testpublic void testDelete() throws IOException { String api = "/api/user/12"; String url = String.format("%s%s", BASE_URL, api); HttpDelete httpDelete = new HttpDelete(url); CloseableHttpResponse response = httpClient.execute(httpDelete); System.out.println(EntityUtils.toString(response.getEntity()));}
请求的取消:
@Testpublic void testCancel() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); HttpGet httpGet = new HttpGet(url); httpGet.setConfig(requestConfig); //设置超时时间//测试连接的取消long begin = System.currentTimeMillis(); CloseableHttpResponse response = httpClient.execute(httpGet);while (true) {if (System.currentTimeMillis() - begin > 1000) { httpGet.abort(); System.out.println("task canceled");break; } } System.out.println(EntityUtils.toString(response.getEntity()));}
调用abort方法取消请求 执行结果:
task canceledcost 8098 mscDisconnected from the target VM, address: '127.0.0.1:60549', transport: 'socket'java.net.SocketException: socket closed...【省略】
OkHttp使用
使用OkHttp发送请求主要分为一下几步骤:
-
创建OkHttpClient对象
-
创建Request对象
-
将Request 对象封装为Call
-
通过Call 来执行同步或异步请求,调用execute方法同步执行,调用enqueue方法异步执行
创建连接:
private OkHttpClient client = new OkHttpClient();
GET请求:
@Testpublic void testGet() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); Request request = new Request.Builder() .url(url) .get() .build();final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string());}
PUT请求:
@Testpublic void testPut() throws IOException { String api = "/api/user"; String url = String.format("%s%s", BASE_URL, api);//请求参数 UserVO userVO = UserVO.builder().name("h2t").id(11L).build(); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), JSONObject.toJSONString(userVO)); Request request = new Request.Builder() .url(url) .put(requestBody) .build();final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string());}
POST请求:
- 添加对象
@Testpublic 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());}
上传文件
@Testpublic void testUpload() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "docker_practice.pdf", RequestBody.create(MediaType.parse("multipart/form-data"),new File("C:/Users/hetiantian/Desktop/学习/docker_practice.pdf"))) .build(); Request request = new Request.Builder() .url(url) .post(requestBody) //默认为GET请求,可以不写 .build();final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string());}
通过addFormDataPart方法模拟表单方式上传文件
DELETE请求:
@Testpublic void testDelete() throws IOException { String url = String.format("%s%s", BASE_URL, api);//请求参数 Request request = new Request.Builder() .url(url) .delete() .build();final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string());}
请求的取消:
@Testpublic void testCancelSysnc() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); Request request = new Request.Builder() .url(url) .get() .build();final Call call = client.newCall(request); Response response = call.execute();long start = System.currentTimeMillis();//测试连接的取消while (true) {//1分钟获取不到结果就取消请求if (System.currentTimeMillis() - start > 1000) { call.cancel(); System.out.println("task canceled");break; } } System.out.println(response.body().string());}
调用cancel方法进行取消 测试结果:
task canceledcost 9110 mscjava.net.SocketException: socket closed...【省略】
小结
-
OkHttp使用build模式创建对象来的更简洁一些,并且使用.post/.delete/.put/.get方法表示请求类型,不需要像HttpClient创建HttpGet、HttpPost等这些方法来创建请求类型
-
依赖包上,如果HttpClient需要发送异步请求、实现文件上传,需要额外的引入异步请求依赖
-
DELETE请求:@Testpublic void testDelete() throws IOException { String url = String.format("%s%s", BASE_URL, api);//请求参数 Request request = new Request.Builder() .url(url) .delete() .build();final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string());}请求的取消:@Testpublic void testCancelSysnc() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); Request request = new Request.Builder() .url(url) .get() .build();final Call call = client.newCall(request); Response response = call.execute();long start = System.currentTimeMillis();//测试连接的取消while (true) {//1分钟获取不到结果就取消请求if (System.currentTimeMillis() - start > 1000) { call.cancel(); System.out.println("task canceled");break; } } System.out.println(response.body().string());}调用cancel方法进行取消 测试结果:
task canceledcost 9110 mscjava.net.SocketException: socket closed...【省略】小结OkHttp使用build模式创建对象来的更简洁一些,并且使用.post/.delete/.put/.get方法表示请求类型,不需要像HttpClient创建HttpGet、HttpPost等这些方法来创建请求类型
依赖包上,如果HttpClient需要发送异步请求、实现文件上传,需要额外的引入异步请求依赖
private CloseableHttpClient httpClient = HttpClientBuilder.create().build();private RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(60 * 1000) .setConnectTimeout(60 * 1000).build();String api = "/api/files/1";String url = String.format("%s%s", BASE_URL, api);HttpGet httpGet = new HttpGet(url);httpGet.setConfig(requestConfig); //设置超时时间超时时间是设置在请求类型HttpGet上,而不是HttpClient上
OkHttp超时设置:直接在OkHttp上进行设置
private OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS)//设置连接超时时间 .readTimeout(60, TimeUnit.SECONDS)//设置读取超时时间 .build();小结:如果client是单例模式,HttpClient在设置超时方面来的更灵活,针对不同请求类型设置不同的超时时间,OkHttp一旦设置了超时时间,所有请求类型的超时时间也就确定
HttpClient和OkHttp性能比较测试环境:
CPU 六核
内存 8G
windows10
每种测试用例都测试五次,排除偶然性
client连接为单例:
client连接不为单例:
单例模式下,HttpClient的响应速度要更快一些,单位为毫秒,性能差异相差不大 非单例模式下,OkHttp的性能更好,HttpClient创建连接比较耗时,因为多数情况下这些资源都会写成单例模式,因此图一的测试结果更具有参考价值
总结OkHttp和HttpClient在性能和使用上不分伯仲,根据实际业务选择即可
最后附:【https://github.com/TiantianUpup/http-call】,欢迎fork与star
技术交流群
相关资源:Androidokhttp3使用实例,OKhttp设置请求超时时间,okgo使用demo...
YUAN LU关注
0
0
1
okhttp设置超时时间zcyt085的博客 1092okhttp设置超时时间 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS)//设置连接超时时间 .readTimeout(20, TimeUnit.SECONDS)//设置读取超时时间 .build();OkHttp设置连接超时时间丿灬安之若死 4558private OkManager() { client = new OkHttpClient() .newBuilder() .connectTimeout(10, TimeUnit.SECONDS)//设置连接超时时间 .readTimeout(20, TimeUnit.SECON...参与评论
OkHttp3超时设置和超时异常捕获_平平定的专栏_okhttp 超时1-17为了容错和更好的用户体验,必须为OkHttp设置超时。 上网找了半天,只找到下面的代码。注意它们不能在 OkHttp3中使用 publicConfigureTimeouts()throwsException { client =newOkHttpClient(); ...Okhttp超时时间设置和相关问题解决_Seven丶Echo的博客...1-10okhttp超时设置okhttp超时相关问题超时时间设置日志拦截器java.net.UnknownHostException异常DNS解析异常拦截okhttp超时相关问题设置了超时时间,但是超时时间还是很长,因为在DNS异常处理时花费了大量时间,我们需要给DNS解析设置超时时间...OkHttp3 超时设置ylineyline的专栏 6225目录 1,AsyncTimeout 2-1,耗时段介绍「从上往下」 2-2,4个超时设置「OkHttpClient.Builder」 2-3,耗时操作之间的关联 okhttp Timeout 超时设置与用法解释 1,AsyncTimeout AsyncTimeout.enter 案例1,首次创建 Watchdog + AsyncTimeout作为static量,避免重复创建 2,单线...微服务请求【跨】工具类fei飞来了 352请求工具类 package com.pacific.property.util; import com.alibaba.fastjson.JSONObject; import com.pacific.property.exception.SysException; import com.pacific.property.model.bo.ErrorCodeEnum; import com.pac...okHttp超时报错解决方案_weixin_30455365的博客2-7okHttp超时报错解决方案 Android 使用okhttp,如果客户端等待的时间超过了okHttp的默认时间,就会报错java.net.SocketTimeoutException: timeout 所以,需要在调用okHttp类时,自定义设置一个最长超时时间就好了...okHttp 添加动态的 超时时间 处理GL_MINE_CSDN的博客 5919场景 ??由于某个接口耗时比较长,故需要对okHttpClient添加动态的超时时间,来满足业务场景 处理方式 ??实现OkHttp动态添加超时时间 实现原理 ??查看Retrofit和OkHttpClient源码,根据Retrofit反射拿到OKHttpClient的信息并进行动态设置超时时间 工具类地址 下载链接 http://download.csdn.net/download/gl_面试官:技术选型,HttpClient还是OkHttp?xmt1139057136的专栏 385你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草来源:juejin.im/post/684490404064447694...okhttp java_java - 如何使用OkHttp设置连接超时weixin_39773817的博客 106java - 如何使用OkHttp设置连接超时我正在使用OkHttp库开发app,我的麻烦是我找不到如何设置连接超时和套接字超时。OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(url).build();Response response = client.newCall(r...OkHttpClient 设置超时时间weixin_44455388的博客 2129OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build();okhttp3.OkHttpClient 默认的三个时间wddptwd28的博客 1889okhttp3.OkHttpClient 默认的三个时间。 connectTimeout = 10_000; readTimeout = 10_000; writeTimeout = 10_000;OkHttp超时时间设置热门推荐天海行者的专栏 1万+ OkHttp3中设置超时的方法 public WebApi(){ client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) ...OkHttp设置超时时间CAir2的专栏 524在使用okHttp的时候我们经常会使用超时设置:如下: okHttpClient = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .dns(new xDns(5)okhttp3 循环调用上传图片的接口,超时wangqiuwei07的专栏 1047我的情况是上传多张图片,但是每次只上传一张图片,循环调用多次接口,提示我超时, 其实只需要设置一下超时时间就可以,OKhttp3以后只能通过设置OkHttpClient.Builder设置超时时间 OkHttpClient.Builder builder = new OkHttpClient.Builder() .connectTimeout(30, Ti...okhttp动态设置超时weifeng的博客 2818一般来说,普通的请求超时时间是15s,但是有的时候上传文件15根本不够,那怎么办呢? 设置两个okhttp不够优雅,我们可以使用Interceptor,内置了帮我们设置动态超时的方法。 /** * Observes, modifies, and potentially short-circuits requests going out and the corresponding * respo...retrfoit+okhttp动态改变连接超时时间jackzhouyu的专栏 2684设置连接超时时间的基本用法 OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); builder.readTimeout(25, TimeUnit.SECONDS); builder.connectTimeout(25, TimeUnit.SECONDS).build(); ...调用服务工具类heihei_100的博客 670import java.nio.charset.Charset; import java.util.Map; import com.alibaba.fastjson.JSONObject; public interface HttpService { String doGet(String url, Map<String, String> params); ...httpclient base64 文件上传_我有选择困难症,到底选HttpClient还是OkHttp?weixin_39853892的博客 35作者:何甜甜在吗来源:https://urlify.cn/IBbMRn# 写在前面为什么会写这篇文章,起因于和朋友的聊天这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okhttp的区别、性能比较进行搜索,没有找到想要的答案,于是就去overstackflow上看看是不是有人问过这个问题,果然不会让你失望的所以从使用、性能、超时配置方面进行比较# 使...maven项目中跨模块远程调用工具类01-24maven项目中跨模块远程调用工具类, 读取配置文件远程调用springclou微服务项目中无法调用其他模块的类最新发布qq_45283095的博客 164问题描述: 当时想在service_hosp模块中调用这个Result类,但是发现没法引入 解决方案: 在service的pom中导入Result类所在的模块??2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页关于我们招贤纳士广告服务开发助手
400-660-0108
kefu@csdn.net
在线客服工作时间 8:30-22:00公安备案号11010502030143京ICP备19004658号京网文〔2020〕1039-165号经营性网站备案信息北京互联网违法和不良信息举报中心家长监护网络110报警服务中国互联网举报中心Chrome商店下载?1999-2022北京创新乐知网络技术有限公司版权与免责声明版权申诉出版物许可证营业执照
YUAN LU码龄4年 暂无认证78原创-周排名48万+总排名3万+访问
等级21积分3粉丝3获赞0评论11收藏
私信关注
热门文章origin图上显示数据标签_Origin 基本操作:在曲线图上添加各种标注的方法 8028hive把字符串转换为时间_Hive 日期格式转换问题 5744integer int转换java_Java中Integer和int之间的转换 1518一台电脑可以安装两个版本的mysql_怎么在一台电脑下安装两个版本的MySql(急!!!!!)... 1391c语言中e的n次方怎么打,C语言中N次方怎么打 1294您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐最新文章ruby网站部署到服务器,Ruby China 已迁移到新的服务器,基于 Docker 部署华为服务器近端连接显示绿屏,故障诊断说明 - 华为服务器 iMana 200 用户指南 26 - 华为...ajax arcengine,ArcGIS客户端开发学习笔记(一)—AJAX机制2021年135篇2020年13篇
目录写在前面使用HttpClient使用介绍创建连接:GET请求:PUT请求:POST请求:上传文件DELETE请求:请求的取消:OkHttp使用创建连接:GET请求:PUT请求:POST请求:上传文件DELETE请求:————————————————版权声明:本文为CSDN博主「YUAN LU」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_29695991/article/details/113078597