Apache HttpClient

學習完整課程請移步 互聯(lián)網 Java 全棧工程師

本節(jié)視頻

簡易架構圖

Apache HttpClient 簡介

HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。HttpClient 已經應用在很多的項目中,比如 Apache Jakarta 上很著名的另外兩個開源項目 Cactus 和 HTMLUnit 都使用了 HttpClient。

HttpClient 相比傳統(tǒng) JDK 自帶的 URLConnection,增加了易用性和靈活性,它不僅是客戶端發(fā)送 HTTP 請求變得容易,而且也方便了開發(fā)人員測試接口(基于 HTTP 協(xié)議的),即提高了開發(fā)的效率,也方便提高代碼的健壯性。因此熟練掌握 HttpClient 是很重要的必修內容,掌握 HttpClient 后,相信對于 HTTP 協(xié)議的了解會更加深入。

Apache HttpClient 特性

  • 基于標準、純凈的 Java 語言。實現(xiàn)了 HTTP 1.0 和 HTTP 1.1
  • 以可擴展的面向對象的結構實現(xiàn)了 HTTP 全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
  • 支持 HTTPS 協(xié)議。
  • 通過 HTTP 代理建立透明的連接。
  • 利用 CONNECT 方法通過 HTTP 代理建立隧道的 HTTPS 連接。
  • Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 認證方案。
  • 插件式的自定義認證方案。
  • 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
  • 連接管理器支持多線程應用。支持設置最大連接數,同時支持設置每個主機的最大連接數,發(fā)現(xiàn)并關閉過期的連接。
  • 自動處理 Set-Cookie 中的 Cookie。
  • 插件式的自定義 Cookie 策略。
  • Request 的輸出流可以避免流中內容直接緩沖到 Socket 服務器。
  • Response 的輸入流可以有效的從 Socket 服務器直接讀取相應內容。
  • 在 HTTP 1.0 和 HTTP 1.1 中利用 KeepAlive 保持持久連接。
  • 直接獲取服務器發(fā)送的 response code 和 headers。
  • 設置連接超時的能力。
  • 實驗性的支持 HTTP 1.1 response caching。
  • 源代碼基于 Apache License 可免費獲取。

Apache HttpClient 使用流程

使用 HttpClient 發(fā)送請求、接收響應很簡單,一般需要如下幾步即可。

  • 創(chuàng)建 HttpClient 對象。
  • 創(chuàng)建請求方法的實例,并指定請求 URL。如果需要發(fā)送 GET 請求,創(chuàng)建 HttpGet 對象;如果需要發(fā)送 POST 請求,創(chuàng)建 HttpPost 對象。
  • 如果需要發(fā)送請求參數,可調用 HttpGet、HttpPost 共同的 setParams(HttpParams params) 方法來添加請求參數;對于 HttpPost 對象而言,也可調用 setEntity(HttpEntity entity) 方法來設置請求參數。
  • 調用 HttpClient 對象的 execute(HttpUriRequest request) 發(fā)送請求,該方法返回一個 HttpResponse
  • 調用 HttpResponsegetAllHeaders()、getHeaders(String name) 等方法可獲取服務器的響應頭;調用 HttpResponsegetEntity() 方法可獲取 HttpEntity 對象,該對象包裝了服務器的響應內容。程序可通過該對象獲取服務器的響應內容。
  • 釋放連接。無論執(zhí)行方法是否成功,都必須釋放連接

Apache HttpClient 使用實例

POM

pom.xml 配置如下:

<!-- Apache Http Begin -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.5</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>fluent-hc</artifactId>
    <version>4.5.5</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.5.5</version>
</dependency>
<!-- Apache Http End -->

主要增加了 org.apache.httpcomponents:httpclient、org.apache.httpcomponents:fluent-hc、org.apache.httpcomponents:httpmime 三個依賴

創(chuàng)建 HttpGet 請求

案例代碼如下:

package com.funtl.hello.httpclient;

import org.apache.http.HttpEntity;
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.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

public class MyTest {
    public static void main(String[] args) {
        get();
    }

    private static void get() {
        // 創(chuàng)建 HttpClient 客戶端
        CloseableHttpClient httpClient = HttpClients.createDefault();

        // 創(chuàng)建 HttpGet 請求
        HttpGet httpGet = new HttpGet("http://localhost:8080/content/page?draw=1&start=0&length=10");
        // 設置長連接
        httpGet.setHeader("Connection", "keep-alive");
        // 設置代理(模擬瀏覽器版本)
        httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
        // 設置 Cookie
        httpGet.setHeader("Cookie", "UM_distinctid=16442706a09352-0376059833914f-3c604504-1fa400-16442706a0b345; CNZZDATA1262458286=1603637673-1530123020-%7C1530123020; JSESSIONID=805587506F1594AE02DC45845A7216A4");

        CloseableHttpResponse httpResponse = null;
        try {
            // 請求并獲得響應結果
            httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            // 輸出請求結果
            System.out.println(EntityUtils.toString(httpEntity));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 無論如何必須關閉連接
        finally {
            if (httpResponse != null) {
                try {
                    httpResponse.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (httpClient != null) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

控制臺輸出結果:

{"draw":1,"recordsTotal":1,"recordsFiltered":1,"data":[{"id":33,"created":1530542074000,"updated":1530542074000,"title":"ad1","subTitle":"ad1","titleDesc":"ad1","url":"https://sale.jd.com/act/XkCzhoisOMSW.html","pic":"https://m.360buyimg.com/babel/jfs/t20164/187/1771326168/92964/b42fade7/5b359ab2N93be3a65.jpg","pic2":"","content":"<p><br></p>","tbContentCategory":{"id":89,"created":null,"updated":null,"parent":null,"isParent":null,"name":"幻燈片","status":null,"sortOrder":null}}],"error":null}

創(chuàng)建 HttpPost 請求

案例代碼如下:

package com.funtl.hello.httpclient;

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
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;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

public class MyTest {
    public static void main(String[] args) {
        post();
    }

    private static void post() {
        // 創(chuàng)建 HttpClient 客戶端
        CloseableHttpClient httpClient = HttpClients.createDefault();

        // 創(chuàng)建 HttpPost 請求
        HttpPost httpPost = new HttpPost("http://localhost:8080/content/page");
        // 設置長連接
        httpPost.setHeader("Connection", "keep-alive");
        // 設置代理(模擬瀏覽器版本)
        httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
        // 設置 Cookie
        httpPost.setHeader("Cookie", "UM_distinctid=16442706a09352-0376059833914f-3c604504-1fa400-16442706a0b345; CNZZDATA1262458286=1603637673-1530123020-%7C1530123020; JSESSIONID=805587506F1594AE02DC45845A7216A4");

        // 創(chuàng)建 HttpPost 參數
        List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
        params.add(new BasicNameValuePair("draw", "1"));
        params.add(new BasicNameValuePair("start", "0"));
        params.add(new BasicNameValuePair("length", "10"));

        CloseableHttpResponse httpResponse = null;
        try {
            // 設置 HttpPost 參數
            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
            httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            // 輸出請求結果
            System.out.println(EntityUtils.toString(httpEntity));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 無論如何必須關閉連接
        finally {
            try {
                if (httpResponse != null) {
                    httpResponse.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

控制臺輸出結果:

{"draw":1,"recordsTotal":1,"recordsFiltered":1,"data":[{"id":33,"created":1530542074000,"updated":1530542074000,"title":"ad1","subTitle":"ad1","titleDesc":"ad1","url":"https://sale.jd.com/act/XkCzhoisOMSW.html","pic":"https://m.360buyimg.com/babel/jfs/t20164/187/1771326168/92964/b42fade7/5b359ab2N93be3a65.jpg","pic2":"","content":"<p><br></p>","tbContentCategory":{"id":89,"created":null,"updated":null,"parent":null,"isParent":null,"name":"幻燈片","status":null,"sortOrder":null}}],"error":null}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容