您好,登錄后才能下訂單哦!
本篇內容主要講解“HttpClient的使用實例”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“HttpClient的使用實例”吧!
HttpClient的使用:
1)httpClient的簡單使用:
import java.net.URI; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; 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.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class HttpClientDemo { public static void main(String[] args) throws Exception { // 1.創建Httpclient對象 CloseableHttpClient httpclient = HttpClients.createDefault(); // 2.1創建http GET請求,并設置參數 String url = "http://www.jxn.com/"; URI uri = new URIBuilder(url).setParameter("name", "jack").setParameter("age", "1").build(); HttpGet httpGet = new HttpGet(uri); // 2.2創建http POST請求,并設置參數 HttpPost httpPost = new HttpPost(url); List<NameValuePair> parameters = new ArrayList<NameValuePair>(); parameters.add(new BasicNameValuePair("name", "jack")); parameters.add(new BasicNameValuePair("age", "1")); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters); httpPost.setEntity(formEntity); // 3.構建請求配置信息 RequestConfig config = RequestConfig.custom().setConnectTimeout(1000) // 創建連接的最長時間 .setConnectionRequestTimeout(500) // 從連接池中獲取到連接的最長時間 .setSocketTimeout(10 * 1000) // 數據傳輸的最長時間 .setStaleConnectionCheckEnabled(true) // 提交請求前測試連接是否可用 .build(); httpGet.setConfig(config); httpPost.setConfig(config); CloseableHttpResponse response = null; try { // 4.執行請求 response = httpclient.execute(httpGet); // response = httpclient.execute(httpPost); if (response.getStatusLine().getStatusCode() == 200) { // 判斷返回狀態是否為200 String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } } finally { if (response != null) { response.close(); } httpclient.close(); } } }
2)使用httpClient連接池:
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.EntityUtils; public class HttpClientConnectionManagerDemo { public static void main(String[] args) throws Exception { PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(200); // 設置最大連接數 connectionManager.setDefaultMaxPerRoute(20); // 設置每個主機地址的并發數 // 執行一次get請求 doGet(connectionManager); } public static void doGet(HttpClientConnectionManager connectionManager) throws Exception { CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build(); String url = "http://www.jxn.com/"; HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } } finally { if (response != null) { response.close(); } // 此處不能關閉httpClient!如果把httpClient關閉掉,則連接池也會被銷毀 // httpClient.close(); } } }
3)HttpClient與Spring整合:
【1】pom.xml文件:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.5</version> </dependency>
【2】spirng配置文件applicationContext-httpclient.xml:
<!-- 定義httpClient連接管理器 --> <bean id="httpClientConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager"> <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 class="org.apache.http.impl.client.CloseableHttpClient" factory-bean="httpClientBuilder" factory-method="build" scope="prototype"> </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 class="org.apache.http.client.config.RequestConfig" factory-bean="requestConfigBuilder" factory-method="build" /> <!-- 定期關閉無效的連接 --> <bean class="com.jxn.common.httpclient.IdleConnectionEvictor"> <constructor-arg index="0" ref="httpClientConnectionManager" /> </bean> 屬性配置文件httpclient.properties: http.maxTotal=200 http.defaultMaxPerRoute=50 http.connectTimeout=1000 http.connectionRequestTimeout=500 http.socketTimeout=10000 http.staleConnectionCheckEnabled=true
【3】封裝成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.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.jxn.common.httpclient.HttpResult; [@Service](https://my.oschina.net/service) public class ApiService implements BeanFactoryAware { private BeanFactory beanFactory; @Autowired(required = false) private RequestConfig requestConfig; [@Override](https://my.oschina.net/u/1162528) public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } private CloseableHttpClient getHttpClient() { return this.beanFactory.getBean(CloseableHttpClient.class); } // 執行GET請求 public String doGet(String url) throws ClientProtocolException, IOException { HttpGet httpGet = new HttpGet(url); httpGet.setConfig(requestConfig); CloseableHttpResponse response = null; try { // 執行請求 response = getHttpClient().execute(httpGet); // 判斷返回狀態是否為200 if (response.getStatusLine().getStatusCode() == 200) { return EntityUtils.toString(response.getEntity(), "UTF-8"); } } finally { if (response != null) { response.close(); } } return null; } // 帶有參數的GET請求 public String doGet(String url, Map<String, String> params) throws ClientProtocolException, IOException, URISyntaxException { URIBuilder builder = new URIBuilder(url); for (Map.Entry<String, String> entry : params.entrySet()) { builder.setParameter(entry.getKey(), entry.getValue()); } return doGet(builder.build().toString()); } // 執行post請求 public HttpResult doPost(String url, Map<String, String> params) throws IOException { // 創建http POST請求 HttpPost httpPost = new HttpPost(url); httpPost.setConfig(requestConfig); if (null != params) { List<NameValuePair> parameters = new ArrayList<NameValuePair>(0); for (Map.Entry<String, String> entry : params.entrySet()) { parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } // 構造一個form表單式的實體 UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8"); httpPost.setEntity(formEntity); } CloseableHttpResponse response = null; try { response = getHttpClient().execute(httpPost); return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString( response.getEntity(), "UTF-8")); } finally { if (response != null) { response.close(); } } } // 執行post請求,發送json數據 public HttpResult doPostJson(String url, String json) throws IOException { // 創建http POST請求 HttpPost httpPost = new HttpPost(url); httpPost.setConfig(requestConfig); if (null != json) { // 構造一個字符串的實體 StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON); httpPost.setEntity(stringEntity); } CloseableHttpResponse response = null; try { response = getHttpClient().execute(httpPost); return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString( response.getEntity(), "UTF-8")); } finally { if (response != null) { response.close(); } } } } // 返回的結果 public class HttpResult { private Integer code; private String data; public HttpResult() { } public HttpResult(Integer code, String data) { this.code = code; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getData() { return data; } public void setData(String data) { this.data = data; } }
【4】實現定期關閉無效的連接:
import org.apache.http.conn.HttpClientConnectionManager; public class IdleConnectionEvictor extends Thread { private final HttpClientConnectionManager connectionManager; private volatile boolean shutdown; // 創建IdleConnectionEvictor對象的時候,啟動線程 public IdleConnectionEvictor(HttpClientConnectionManager connectionManager) { this.connectionManager = connectionManager; this.start(); } [@Override](https://my.oschina.net/u/1162528) public void run() { try { while (!shutdown) { synchronized (this) { wait(5000); // 關閉失效的連接(每隔5秒檢查一次) connectionManager.closeExpiredConnections(); } } } catch (InterruptedException ex) { // 結束 } } public void shutdown() { shutdown = true; synchronized (this) { notifyAll(); } } }
到此,相信大家對“HttpClient的使用實例”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。