一.org.apache.commons.httpclient和org.apache.http.client區別(轉)
官網說明:
http://hc.apache.org/httpclient-3.x/
Commons HttpClient項目現已結束,不再開發。它已被其HttpClient和HttpCore模塊中的Apache HttpComponents項目所取代,它們提供更好的性能和更大的靈活性。
從2011年開始,org.apache.commons.httpclient就不再開發。這就是說,它已經落伍了。
方法的對稱性上的區別
一、org.apache.http.client
org.apache.http.client在發起請求前,假如對某個參數a 進行url encode編碼。服務端必須進行url decode。
//客戶端編碼
Stirng a=URLEncoder.encode(cont,"GBK");
//服務端解碼
URLDecoder.decode(a,"gbk");
且服務器端獲取到的參數a為可識別的沒有任何變動的url encode后原值。
二、org.apache.commons.httpclient
org.apache.commons.httpclient則與之相反。
服務端獲取到的a為不可識別的亂碼,且不能用url decode解碼。
//服務端解碼
new String(cont.getBytes("ISO8859_1"), "GBK")
與時俱進
org.apache.http.client更好的性能和更大的靈活性。
可以很方便的支持json,xml等數據的傳輸。且http://mvnrepository.com上在不斷的升級。超時、最大連接數等配置靈活方便。
三.pom.xml
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.1</version> </dependency>
最最簡單的方法
利用Jsoup直接獲取HTML頁面
Document doc = Jsoup.connect("http://www.xbiquge.la/xiaoshuodaquan/").get();
Elements elements = doc.getElementsContainingOwnText("斗破蒼穹");
四.簡單使用方法
package com.feilong.reptile.util; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.util.ArrayList; import java.util.List; import org.apache.commons.codec.Charsets; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; public class MHttpClient { public void get(String url) throws Exception { // 創建HttpClient實例 HttpClient client = HttpClientBuilder.create().build(); // 根據URL創建HttpGet實例 HttpGet get = new HttpGet(url); // 執行get請求,得到返回體 HttpResponse response = client.execute(get); // 判斷是否正常返回 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 解析數據 String data = EntityUtils.toString(response.getEntity(),Charsets.UTF_8); System.out.println(data); } } public void post(String url) throws Exception { // 創建HttpClient實例 HttpClient client = HttpClientBuilder.create().build(); // 根據URL創建HttpPost實例 HttpPost post = new HttpPost(url); // 構造post參數 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("name", "11")); // 編碼格式轉換 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params); // 傳入請求體 post.setEntity(entity); // 發送請求,得到響應體 HttpResponse response = client.execute(post); // 判斷是否正常返回 if (response.getStatusLine().getStatusCode() == 200) { // 解析數據 HttpEntity resEntity = response.getEntity(); String data = EntityUtils.toString(resEntity); System.out.println(data); } } public static void main(String[] args) throws Exception { MHttpClient cl = new MHttpClient(); String url = "http://www.xbiquge.la/xiaoshuodaquan/"; cl.get(url); } }
六. 復雜使用方法
package com.feilong.reptile.util; import java.io.IOException; import java.io.InterruptedIOException; import java.net.UnknownHostException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.net.ssl.SSLException; import org.apache.commons.codec.Charsets; import org.apache.http.Header; import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.client.utils.URIBuilder; import org.apache.http.config.SocketConfig; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; /** * 使用HttpClient發送和接收Http請求 * * @author manzhizhen * */ public class HttpUtils { private static HttpClient httpClient; // 最大連接數 private static final int MAX_CONNECTION = 100; // 每個route能使用的最大連接數,一般和MAX_CONNECTION取值一樣 private static final int MAX_CONCURRENT_CONNECTIONS = 100; // 建立連接的超時時間,單位毫秒 private static final int CONNECTION_TIME_OUT = 1000; // 請求超時時間,單位毫秒 private static final int REQUEST_TIME_OUT = 1000; // 最大失敗重試次數 private static final int MAX_FAIL_RETRY_COUNT = 3; // 請求配置,可以復用 private static RequestConfig requestConfig; static { SocketConfig socketConfig = SocketConfig.custom() .setSoTimeout(REQUEST_TIME_OUT).setSoKeepAlive(true) .setTcpNoDelay(true).build(); requestConfig = RequestConfig.custom() .setSocketTimeout(REQUEST_TIME_OUT) .setConnectTimeout(CONNECTION_TIME_OUT).build(); /** * 每個默認的 ClientConnectionPoolManager 實現將給每個route創建不超過2個並發連接,最多20個連接總數。 */ PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); connManager.setMaxTotal(MAX_CONNECTION); connManager.setDefaultMaxPerRoute(MAX_CONCURRENT_CONNECTIONS); connManager.setDefaultSocketConfig(socketConfig); httpClient = HttpClients.custom().setConnectionManager(connManager) // 添加重試處理器 .setRetryHandler(new MyHttpRequestRetryHandler()).build(); } public static void main(String[] args) { testGet(); } /** * 測試get方法 */ private static void testGet() { String url = "http://restapi.amap.com/v3/place/text"; Map<String, String> paramMap = new HashMap<String, String>(); paramMap.put("key", "95708f902ac2428ea119ec99fb70e6a3"); paramMap.put("keywords", "互聯網金融大廈"); paramMap.put("city", "330100"); paramMap.put("extensions", "all"); try { System.out.println(get(url, paramMap)); } catch (Exception e) { e.printStackTrace(); } } /** * post請求 * * @param url * @param paramMap * @param headers * @return * @throws Exception */ public static String post(String url, Map<String, String> paramMap, List<Header> headers) throws Exception { URIBuilder uriBuilder = new URIBuilder(url); if (paramMap != null) { // 添加請求參數 for (Entry<String, String> entry : paramMap.entrySet()) { uriBuilder.addParameter(entry.getKey(), entry.getValue()); } } HttpPost httpPost = new HttpPost(uriBuilder.build()); if (headers != null) { // 添加請求首部 for (Header header : headers) { httpPost.addHeader(header); } } httpPost.setConfig(requestConfig); // 執行請求 HttpResponse response = httpClient.execute(httpPost); return EntityUtils.toString(response.getEntity(), Charsets.UTF_8); } /** * post請求,不帶請求首部 * * @param url * @param paramMap * @return * @throws Exception */ public static String post(String url, Map<String, String> paramMap) throws Exception { return post(url, paramMap, null); } /** * get請求 * * @param url * @param paramMap * @param headers * @return * @throws Exception */ public static String get(String url, Map<String, String> paramMap, List<Header> headers) throws Exception { URIBuilder uriBuilder = new URIBuilder(url); if (paramMap != null) { // 添加請求參數 for (Entry<String, String> entry : paramMap.entrySet()) { uriBuilder.addParameter(entry.getKey(), entry.getValue()); } } HttpGet httpGet = new HttpGet(uriBuilder.build()); if (headers != null) { // 添加請求首部 for (Header header : headers) { httpGet.addHeader(header); } } httpGet.setConfig(requestConfig); // 執行請求 HttpResponse response = httpClient.execute(httpGet); return EntityUtils.toString(response.getEntity(), Charsets.UTF_8); } /** * get請求,不帶請求首部 * * @param url * @param paramMap * @return * @throws Exception */ public static String get(String url, Map<String, String> paramMap) throws Exception { return get(url, paramMap, null); } /** * 請求重試處理器 * @author manzhizhen * */ private static class MyHttpRequestRetryHandler implements HttpRequestRetryHandler { @Override public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { if (executionCount >= MAX_FAIL_RETRY_COUNT) { return false; } if (exception instanceof InterruptedIOException) { // 超時 return false; } if (exception instanceof UnknownHostException) { // 未知主機 return false; } if (exception instanceof ConnectTimeoutException) { // 連接被拒絕 return false; } if (exception instanceof SSLException) { // SSL handshake exception return false; } HttpClientContext clientContext = HttpClientContext.adapt(context); HttpRequest request = clientContext.getRequest(); boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); if (idempotent) { // 如果請求被認為是冪等的,則重試 return true; } return false; } } }
七.運行時完整pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.feilong</groupId> <artifactId>reptile</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>reptile</name> <description>reptile for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>