发布: 更新时间:2022-10-22 21:00:26
HttpCLient最关键的方法是执行HTTP请求的方法execute。只要把HTTP请求传入,就可以得到HTTP响应
用HttpClient请求一个Http请求的步骤为:
HttpClient的实现类为CloseableHttpClient。创建CloseableHttpClient实例有两种方式
import org.apache.http.impl.client.HttpClients; // 调用httpClients类
// CloseableHttpClient httpClient = HttpClients.createDefault(); 返回一个CloseableHttpClient类。直接调用方法,看方法前面返回类型
// 再导入相应的包和实例化对象接收返回值
// 设置线程数
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(100);
// 设置请求和传输超时时间
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout)
.setConnectTimeout(connectTimeout).build();
// 创建HttpClient对象
CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(cm)
.setDefaultRequestConfig(requestConfig).build();
先对一些属性进行配置(不断的调用.setxxxxx()
方法就行了),再调用build方法来创建实例。
HttpClients.createDefault()
实际上调用的也就是HttpClientBuilder.create().build()。
InternalHttpClient底层实现了:HttpCLientConnectionManager、HttpRoutePlanner和RequestConfig,下边分别介绍:
(1)HttpCLientConnectionManager:HTTP连接管理器介绍
作用:它负责新HTTP连接的创建、管理连接的生命周期还有保证一个HTTP连接在某一时刻只被一个线程使用
两种具体实现:
1、BasicHttpClientConnectionManager
每次只管理一个connection,所以只能被一个线程使用。它在管理连接的时候如果发现有相同route的请求,会复用之前已经创建的连接,如果新来的请求不能复用之前的连接,它会关闭现有的连接并重新打开它来响应新的请求
管理着一个连接池,以同时为多个线程服务。每次新来一个请求,如果在连接池中已经存在route相同并且可用的connection,连接池就会直接复用这个connection;当不存在route相同的connection,就新建一个connection为之服务;如果连接池已满,则请求会等待直到被服务或者超时
setMaxPerRoute(默认值20):总的最大连接数量
setMaxTotal(默认值200):每个route的最大连接数量
如果所有的连接请求都是到同一个url,那可以把MaxPerRoute的值设置成和MaxTotal一致,这样就能更高效地复用连接
(2)HttpRoutePlanner:HttpClient复杂的路由策略以及代理介绍
HttpRoutePlanner是基于http上下文情况下,客户端到服务器的路由计算策略,一般没有代理的话,就不用设置这个东西。这里有一个很关键的概念—Route:在HttpClient中,一个Route指运行环境机器->目标机器host的一条线路,也就是如果目标url的host是同一个,那么它们的route也是一样的
(3)RequestConfig:对request的一些配置
里面比较重要的有三个超时时间,默认的情况下这三个超时时间都为0(如果不设置request的Config,会在execute的过程中使用HttpClientParamConfig的getRequestConfig中用默认参数进行设置),这也就意味着无限等待,很容易导致所有的请求阻塞在这个地方无限期等待。这三个超时时间为:
a、connectionRequestTimeout—从连接池中取连接的超时时间
b、connectTimeout—连接超时时间
c、socketTimeout—请求超时时间
// 设置请求和传输超时时间
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout)
.setConnectTimeout(connectTimeout).build();
HttpClient支持所有的HTTP1.1中的所有定义的请求类型:GET、HEAD、POST、PUT、DELETE、TRACE和OPTIONS。对使用的类为HttpGet、HttpHead、HttpPost、HttpPut、HttpDelete、HttpTrace和HttpOptions。一个Request还可以addHeader、setEntity、setConfig等
创建一个带参数的请求对象:
import org.apache.http.client.methods.HttpGet; // 导入请求包
StringBuffer params = new StringBuffer();
try {
// 字符数据最好encoding以下;这样一来,某些特殊字符才能传过去(如:某人的名字就是“&”,不encoding的话,传不过去)
params.append("name=" + URLEncoder.encode("&", "utf-8"));
params.append("&");
params.append("age=24");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
HttpGet x =new HttpGet("http://127.0.0.1:777/api/mgr/signin"+"?"+params);
CloseableHttpResponse response = httpClient.execute(x)
HttpContext是跟一个连接相关联的,所以它也只能属于一个线程,如果没有特别设定,在execute的过程中,HttpClient会自动为每一个connection new一个HttpClientHttpContext。
一个execute执行流程:
HttpEntity entityTest = response.getEntity();
System.out.println(EntityUtils.toString(entityTest,"utf-8"));
response.close();
httpclient.close();
URIBuilder 工具类
标签:httpclient, 请求步骤原神3.8心海武器推荐 原神3.8心海带什么武器
阴阳师寻迹骰怎么获得 阴阳师寻迹骰获得方法
王者荣耀妄想都市观光怎么获得 王者荣耀妄想都市观光活动
阴阳师新召唤屋和幕间皮肤效果怎么样 阴阳师新召唤屋和幕间皮肤获取方法介绍
羊了个羊7.26攻略 羊了个羊7月26日怎么过
崩坏星穹铁道求不得成就攻略介绍 崩坏星穹铁道求不得成就怎么获得
崩坏星穹铁道去吧阿刃成就攻略介绍 崩坏星穹铁道去吧阿刃成就怎么获得
时空中的绘旅人罗夏生日有什么复刻 绘旅人罗夏生日礼包复刻一览
银河境界线武器强度怎么看 银河境界线武器强度排行攻略
阴阳师红蛋蛋限时福利怎么获得 阴阳师再结前缘版本福利介绍