httpclient知识点

267 阅读2分钟

超时

最佳实践
s级别。一般就是几s。


工作使用
请求连接超时,10s。

读超时,3s。

重试

默认3次,最佳实践关闭。具体做法就是设置重试次数为0。

代码

client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0 //重试次数0, false));

同步异步

略。

请求头参数

比如,字符集等等。

工作使用

应用场景
基本上所有的接口调用,本质都是基于httpclient。只不过每个公司可能自己基于httpclient稍微简单封装了一下。


基础组件
其实就是简单封装了httpclient。

okClient优点

异步
可以异步。

底层实现是Call。即nio的异步非阻塞机制。

支持http2等新的http协议方面的东西。

注:其实httpclient也有。只不过需要引入异步jar包。


速度
都差不多。

异常

如何处理?
步骤
1.中止当前请求
2.retry


中止
中止当前请求方法abort()。


何时重试?
try catch异常里


重试几次?
一直重试。因为是递归调用自己。

返回值

最佳实践
一般都是字符串String,然后自己解析字符串数据,得到对象。比如json对象。


字符串格式
1.xml //当前用的也比较多。
2.json //最佳实践。趋势。


本身
方法返回数据本身是对象。但是你要得到的其实是字符串。怎么转换?object.toString()。

单例

最佳实践
一般都是单例模式。


代码

//数据
private static volatile HttpClientUtils instance = null; //1.静态数据,就是只有一个对象 2.volatile,是为了解决多线程并发情况下的线程可见性问题

//方法
static init(){  //方法也是静态的
new 对象,然后赋值
}

连接池

问题
httpclient-怎么会有连接池?他不是客户端吗?

连接池不分服务器客户端,客户端也可以复用连接对象。因为很可能客户端,并发量很高,创建到服务器的连接是很耗费资源的,这个耗费资源,不仅耗费服务器,同样耗费客户端。

比如,应用程序访问连接数据库的时候,应用程序也是客户端,但是应用程序必须要是有连接池。因此,服务器和客户端是平等的。而且建立连接的两端是同时受高并发的影响的。


应用场景
虽然,最佳实践一般是单例。但是也可以非单例,非单例就使用连接池,因为复用对象。


参考
mp.weixin.qq.com/s/gSj61nsds… HttpClient连接池设置引发的一次雪崩 //这篇文章写的真好,不但分析了问题的原因和排查流程,还带出了很多的技术细节

spring-RestTemplate

跟httpclient差不多。

参考

www.iteye.com/blog/jinnia… //讲有哪些参数配置

mp.weixin.qq.com/s/we4-LDavT… //讲httpclient和okclient的比较

hc.apache.org/httpcompone… //官方文档。很全很权威。

www.ibm.com/developerwo… //入门