1. 程式人生 > >HttpClient獲取數據

HttpClient獲取數據

highlight rgs sea 響應 響應頭 工具 t對象 build 瀏覽器

  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獲取數據