HttpClient獲取數據
HttpClient 是Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。如果只是需要向Web站點的某個簡單頁面提交請求並獲取服務器響應,HttpURLConnection完全可以勝任。但在絕大部分情況下,Web站點的網頁可能沒這麽簡單,這些頁面並不是通過一個簡單的URL就可訪問的,可能需要用戶登錄而且具有相應的權限才可訪問該頁面。在這種情況下,就需要涉及Session、Cookie的處理了,如果打算使用HttpURLConnection來處理這些細節,當然也是可能實現的,只是處理起來難度就大了。
為了更好地處理向Web站點請求,包括處理Session、Cookie等細節問題,Apache開源組織提供了一個HttpClient項目,看它的名稱就知道,它是一個簡單的HTTP客戶端(並不是瀏覽器),可以用於發送HTTP請求,接收HTTP響應。但不會緩存服務器的響應,不能執行HTML頁面中嵌入的Javascript代碼;也不會對頁面內容進行任何解析、處理。
簡單來說,HttpClient就是一個增強版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection沒有提供的有些功能,HttpClient也提供了,但它只是關註於如何發送請求、接收響應,以及管理HTTP連接。
HttpClient的使用
使用HttpClient發送請求、接收響應很簡單,只要如下幾步即可。
1.創建HttpClient對象。
2.如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。
3.如果需要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HttpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(HttpEntity entity)方法來設置請求參數。
4.調用HttpClient對象的execute(HttpUriRequest request)發送請求,執行該方法返回一個HttpResponse。
5.調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可通過該對象獲取服務器的響應內容。
HttpGet方式獲取數據
import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import java.io.IOException; public class HttpClientTest { public static void main(String[] args) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); RequestConfig config = RequestConfig.custom() .setConnectTimeout(60000) .setConnectionRequestTimeout(60000) .setSocketTimeout(60000) .build(); HttpGet httpGet = new HttpGet("https://baike.baidu.com/item/httpclient/5766483?fr=aladdin"); httpGet.setConfig(config); CloseableHttpResponse response = null; try { //執行httpGet請求 response = httpClient.execute(httpGet); System.out.println(response.getStatusLine().getStatusCode()); //獲取響應實體 HttpEntity httpEntity = response.getEntity(); if (httpEntity != null) { System.out.println("長度:\t" + httpEntity.getContentLength()); System.out.println("內容:\t" + EntityUtils.toString(httpEntity,"UTF-8")); } } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } }
HttpPost方式獲取數據
@Test public void httpPost(){ CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpPost post = new HttpPost("http://localhost:8080/Servlet/do_login.do"); //設置post請求傳遞參數 List<NameValuePair> list = new ArrayList<>(); list.add(new BasicNameValuePair("username","test") ); list.add(new BasicNameValuePair("password","admin")); try { UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list); post.setEntity(entity); }catch (Exception e){ e.printStackTrace(); } //執行請求並處理響應 try{ CloseableHttpResponse response = httpClient.execute(post); HttpEntity httpEntity = response.getEntity(); if(httpEntity!=null){ System.out.println(EntityUtils.toString(httpEntity,"UTF-8")); } response.close(); }catch (Exception e){ e.printStackTrace(); }finally { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } }
HttpClient獲取數據