一、簡介
HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,并且它支持HTTP協議最新的版本和建議。HttpClient已經應用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。
下載地址: http://hc.apache.org/downloads.cgi
二、特性
1. 基于標準、純凈的java語言。實現了Http1.0和Http1.1
2. 以可擴展的面向對象的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支持HTTPS協議。
4. 通過Http代理建立透明的連接。
5. 利用CONNECT方法通過Http代理建立隧道的https連接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。
7. 插件式的自定義認證方案。
8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
9. 連接管理器支持多線程應用。支持設置最大連接數,同時支持設置每個主機的最大連接數,發現并關閉過期的連接。
10. 自動處理Set-Cookie中的Cookie。
11. 插件式的自定義Cookie策略。
12. Request的輸出流可以避免流中內容直接緩沖到socket服務器。
13. Response的輸入流可以有效的從socket服務器直接讀取相應內容。
14. 在http1.0和http1.1中利用KeepAlive保持持久連接。
15. 直接獲取服務器發送的response code和 headers。
16. 設置連接超時的能力。
17. 實驗性的支持http1.1 response caching。
18. 源代碼基于Apache License 可免費獲取。
spring httpclient
HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能,但是對于大部分應用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,并且它支持 HTTP 協議最新的版本和建議。
spring與httpclient集成方式如下:
引入jar包
1
2
3
4
5
|
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version> 4.5 . 2 </version> </dependency> |
2.編寫執行get和post請求的java類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
package com.wee.common.service; import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.wee.common.bean.HttpResult; @Service public class HttpClientService { @Autowired private CloseableHttpClient httpClient; @Autowired private RequestConfig requestConfig; /** * 執行GET請求 * * @param url * @return * @throws IOException * @throws ClientProtocolException */ public String doGet(String url) throws ClientProtocolException, IOException { // 創建http GET請求 HttpGet httpGet = new HttpGet(url); httpGet.setConfig( this .requestConfig); CloseableHttpResponse response = null ; try { // 執行請求 response = httpClient.execute(httpGet); // 判斷返回狀態是否為200 if (response.getStatusLine().getStatusCode() == 200 ) { return EntityUtils.toString(response.getEntity(), "UTF-8" ); } } finally { if (response != null ) { response.close(); } } return null ; } /** * 帶有參數的GET請求 * * @param url * @param params * @return * @throws URISyntaxException * @throws IOException * @throws ClientProtocolException */ public String doGet(String url, Map<String, String> params) throws ClientProtocolException, IOException, URISyntaxException { URIBuilder uriBuilder = new URIBuilder(url); for (String key : params.keySet()) { uriBuilder.addParameter(key, params.get(key)); } return this .doGet(uriBuilder.build().toString()); } /** * 執行POST請求 * * @param url * @param params * @return * @throws IOException */ public HttpResult doPost(String url, Map<String, String> params) throws IOException { // 創建http POST請求 HttpPost httpPost = new HttpPost(url); httpPost.setConfig( this .requestConfig); if (params != null ) { // 設置2個post參數,一個是scope、一個是q List<NameValuePair> parameters = new ArrayList<NameValuePair>(); for (String key : params.keySet()) { parameters.add( new BasicNameValuePair(key, params.get(key))); } // 構造一個form表單式的實體 UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8" ); // 將請求實體設置到httpPost對象中 httpPost.setEntity(formEntity); } CloseableHttpResponse response = null ; try { // 執行請求 response = httpClient.execute(httpPost); return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity(), "UTF-8" )); } finally { if (response != null ) { response.close(); } } } /** * 執行POST請求 * * @param url * @return * @throws IOException */ public HttpResult doPost(String url) throws IOException { return this .doPost(url, null ); } /** * 提交json數據 * * @param url * @param json * @return * @throws ClientProtocolException * @throws IOException */ public HttpResult doPostJson(String url, String json) throws ClientProtocolException, IOException { // 創建http POST請求 HttpPost httpPost = new HttpPost(url); httpPost.setConfig( this .requestConfig); if (json != null ) { // 構造一個form表單式的實體 StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON); // 將請求實體設置到httpPost對象中 httpPost.setEntity(stringEntity); } CloseableHttpResponse response = null ; try { // 執行請求 response = this .httpClient.execute(httpPost); return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity(), "UTF-8" )); } finally { if (response != null ) { response.close(); } } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
HttpResult.java public class HttpResult { /** * 狀態碼 */ private Integer status; /** * 返回數據 */ private String data; public HttpResult() { } public HttpResult(Integer status, String data) { this .status = status; this .data = data; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this .status = status; } public String getData() { return data; } public void setData(String data) { this .data = data; } } |
3.spring和httpClient整合配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<!-- 定義連接管理器 --> <bean id= "httpClientConnectionManager" class = "org.apache.http.impl.conn.PoolingHttpClientConnectionManager" destroy-method= "close" > <!-- 最大連接數 --> <property name= "maxTotal" value= "${http.maxTotal}" /> <!-- 設置每個主機地址的并發數 --> <property name= "defaultMaxPerRoute" value= "${http.defaultMaxPerRoute}" /> </bean> <!-- httpclient對象構建器 --> <bean id= "httpClientBuilder" class = "org.apache.http.impl.client.HttpClientBuilder" > <!-- 設置連接管理器 --> <property name= "connectionManager" ref= "httpClientConnectionManager" /> </bean> <!-- 定義Httpclient對象 --> <bean id= "httpClient" class = "org.apache.http.impl.client.CloseableHttpClient" factory-bean= "httpClientBuilder" factory-method= "build" scope= "prototype" > </bean> <!-- 定義清理無效連接 --> <bean class = "com.taotao.common.httpclient.IdleConnectionEvictor" destroy-method= "shutdown" > <constructor-arg index= "0" ref= "httpClientConnectionManager" /> </bean> <bean id= "requestConfigBuilder" class = "org.apache.http.client.config.RequestConfig.Builder" > <!-- 創建連接的最長時間 --> <property name= "connectTimeout" value= "${http.connectTimeout}" /> <!-- 從連接池中獲取到連接的最長時間 --> <property name= "connectionRequestTimeout" value= "${http.connectionRequestTimeout}" /> <!-- 數據傳輸的最長時間 --> <property name= "socketTimeout" value= "${http.socketTimeout}" /> <!-- 提交請求前測試連接是否可用 --> <property name= "staleConnectionCheckEnabled" value= "${http.staleConnectionCheckEnabled}" /> </bean> <!-- 定義請求參數 --> <bean id= "requestConfig" class = "org.apache.http.client.config.RequestConfig" factory-bean= "requestConfigBuilder" factory-method= "build" > </bean> |
4.httpclient.properties
1
2
3
4
5
6
|
httpClient.maxTotal= 200 httpClient.defaultMaxPerRoute= 50 httpClient.connectTimeout= 1000 httpClient.connectionRequestTimeout= 500 httpClient.socketTimeout= 10000 httpClient.staleConnectionCheckEnabled= true |
5.使用一個單獨的線程完成連接池中的無效鏈接的清理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.wee.common.httpclient; import org.apache.http.conn.HttpClientConnectionManager; public class IdleConnectionEvictor extends Thread { private final HttpClientConnectionManager connMgr; private volatile boolean shutdown; public IdleConnectionEvictor(HttpClientConnectionManager connMgr) { this .connMgr = connMgr; // 啟動當前線程 this .start(); } @Override public void run() { try { while (!shutdown) { synchronized ( this ) { wait( 5000 ); // 關閉失效的連接 connMgr.closeExpiredConnections(); } } } catch (InterruptedException ex) { // 結束 } } public void shutdown() { shutdown = true ; synchronized ( this ) { notifyAll(); } } } |
到此這篇關于spring集成httpclient配置的文章就介紹到這了,更多相關spring httpclient配置內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/A-yes/p/9894176.html#4899710