HttpClient使用高级-apachehttpclient方式实现

HttpClient使⽤⾼级-apachehttpclient⽅式实现
1、获取接⼝定义【⾃定义RequestHttp】
作⽤:⽣成(获取)http请求客户端
1.1获取httpClient
2.获取httpProxy
public interface RequestHttp<H, P> {
/**
* 返回httpClient.CloseableHttpClient是apache的⼀个类
*
* @return 返回httpClient
*/
H getRequestHttpClient();
/**
* 返回httpProxy.HttpHost 是apache的⼀个类
* @return 返回httpProxy
*/
一面 阿累P getRequestHttpProxy();
/**
* 返回HttpType.
*
*JODD_HTTP
Jodd提供⼀个很轻量级、原⽣的的http客户端,使⽤起来很简单、⽅便。它能很⽅便的发送和接收http消息
HttpClient
Apache Jakarta Common下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持HTTP协议的客户端编程⼯具包,并且它⽀持HTTP协议最新的版本和建议
OK_HTTP
⼀个处理⽹络请求的开源项⽬,是安卓端最⽕热的轻量级框架,由移动⽀付Square公司贡献(该公司还贡献了Picasso) ⽤于替代HttpUrlConnection和Apache HttpClien
*/
HttpType getRequestType();
}
1.2、接⼝实现
属性:
private CloseableHttpClient httpClient;
private HttpHost httpProxy;
⽅法:
public void initHttp() {
//⾸先、从内存中获取
WxMpConfigStorage configStorage = WxMpConfigStorage();
ApacheHttpClientBuilder apacheHttpClientBuilder = ApacheHttpClientBuilder();
//其次、使⽤默认⽅式创建
if (null == apacheHttpClientBuilder) {
apacheHttpClientBuilder = ();
}
//最后、设置代理
apacheHttpClientBuilder.HttpProxyHost())
.HttpProxyPort())
.HttpProxyUsername())
.HttpProxyPassword());
if (HttpProxyHost() != null && HttpProxyPort() > 0) {
this.httpProxy = new HttpProxyHost(), HttpProxyPort());
}
this.httpClient = apacheHttpClientBuilder.build();
}
1.3、httpClient  管理器
具体创建【httpclient 连接管理器】  DefaultApacheHttpClientBuilder
public interface ApacheHttpClientBuilder {
/**
* 构建httpclient实例.
*
* @return new instance of CloseableHttpClient
*/
CloseableHttpClient build();
/**
*/
ApacheHttpClientBuilder httpProxyHost(String httpProxyHost);
/
**
* 代理服务器端⼝.
*/
ApacheHttpClientBuilder httpProxyPort(int httpProxyPort);
/**
* 代理服务器⽤户名.
*/
ApacheHttpClientBuilder httpProxyUsername(String httpProxyUsername);
/**
* 代理服务器密码.
*/
ApacheHttpClientBuilder httpProxyPassword(String httpProxyPassword);
/**
* ssl连接socket⼯⼚.
*/
ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFactory sslConnectionSocketFactory); }
1.4、httpClient  管理器实现类
1、获取
// 单例模式,并持有唯⼀的CloseableHttpClient(仅⾸次调⽤创建)
public static DefaultApacheHttpClientBuilder get() {
return DefaultApacheHttpClientBuilder.SingletonHolder.INSTANCE;
}
// 内部类
private static class SingletonHolder {
private static final DefaultApacheHttpClientBuilder INSTANCE = new
DefaultApacheHttpClientBuilder();
}
2.空闲连接控制器
public static class IdleConnectionMonitorThread extends Thread {
private final HttpClientConnectionManager connMgr;
private final int idleConnTimeout;
private final int checkWaitTime;
//是否停⽌
private volatile boolean shutdown;
public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr, int idleConnTimeout, int checkWaitTime) {      super("IdleConnectionMonitorThread");
this.idleConnTimeout = idleConnTimeout;
this.checkWaitTime = checkWaitTime;科技管理研究
}
@Override
public void run() {
try {
while (!this.shutdown) {
synchronized (this) {
wait(this.checkWaitTime);
TimeUnit.MILLISECONDS);
}
}
} catch (InterruptedException ignore) {
}
5-氯-2-戊酮
}
public void trigger() {
synchronized (this) {
notifyAll();
}
}
public void shutdown() {
this.shutdown = true;
synchronized (this) {
notifyAll();
}
}
}
1.5.Http连接池
1、降低延迟:如果不采⽤连接池,每次连接发起Http请求的时候都会重新建⽴TCP连接(经历3次握⼿),⽤完就会关闭连接(4次挥⼿),如果采⽤连接池则减少了这部分时间损耗,别⼩看这⼏次握⼿,本⼈经过测试发现,基本上3倍的时间延迟
2、⽀持更⼤的并发:如果不采⽤连接池,每次连接都会打开⼀个端⼝,在⼤并发的情况下系统的端⼝资源很快就会被⽤完,导致⽆法建⽴新的连接
1.5.1代码
1、HttpConnectionManager.java连接池管理类,⽀持https协议
@Component
public class HttpConnectionManager {
PoolingHttpClientConnectionManager cm = null;
@PostConstruct
public void init() {
LayeredConnectionSocketFactory sslsf = null;
try {
sslsf = new Default());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
.register("https", sslsf)
.register("http", new PlainConnectionSocketFactory())民商法论丛
.build();
cm =new PoolingHttpClientConnectionManager(socketFactoryRegistry);
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(20);
}
public CloseableHttpClient getHttpClient() {
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
/*CloseableHttpClient httpClient = ateDefault();//如果不采⽤连接池就是这种⽅式获取连接*/
return httpClient;
}
}
1.5.2、连接池消费类:HaoMaiClient.java
@Component
public class HaoMaiClient {
@Autowired
HttpConnectionManager connManager;
public <T> T get(String path,Class<T> clazz){
CloseableHttpClient HttpClient();
华中农业大学学报HttpGet httpget = new HttpGet(path);
String json=null;
CloseableHttpResponse response=null;
try {
response = ute(httpget);
InputStream Entity().getContent();
String(in);
in.close();
} catch (UnsupportedOperationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(response!=null){
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return JSON.parseObject(json, clazz);
}
}
1.5.3、原理及注意事项
连接池中连接都是在发起请求的时候建⽴,并且都是长连接
HaoMaiClient.java中的in.close();作⽤就是将⽤完的连接释放,下次请求可以复⽤,这⾥特别注意的是,如果不使⽤in.close();⽽仅仅使⽤response.close();结果就是连接会被关闭,并且不能被复⽤,这样就失去了采⽤连接池的意义。
连接池释放连接的时候,并不会直接对TCP连接的状态有任何改变,只是维护了两个Set,leased和avaliabled,leased代表被占⽤的连接集合,avaliabled代表可⽤的连接的集合,释放连接的时候仅仅是将连接从leased中remove掉了,并把连接放到avaliabled集合中
2、获取接⼝定义【⾃定义RequestExecutor】
作⽤:⽣成http请求执⾏
沙县县委书记
实现类中有变量:RequestHttp<H, P> requestHttp;
再具体执⾏过程中,通过requestHttp获取httpClient后执⾏execute();
构建协议:HttpGet httpGet = new HttpGet(uri);
执⾏请求:CloseableHttpResponse response = RequestHttpClient().execute(httpGet)

本文发布于:2024-09-25 16:36:14,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/181793.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:连接   请求   时候   代理服务器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议