HttpClient和HttpURLConnection的區別和案例
HttpURLConnection 物件
1. HttpURLConnection物件需要通過URL類中的openConnection()方法來獲得,它無法直接構造。
HttpsURLConnection urlconn = null; URL url = new URL(address); urlconn = (HttpsURLConnection)url.openConnection();
2. HttpURLConnection的connect()函式,實際上只是建立了一個與伺服器的TCP連線,並沒有實際傳送HTTP請求。HTTP請求實際上直到我們獲取伺服器響應資料(如呼叫getInputStream()、getResponseCode()等方法)時才正式傳送出去。並且HttpURLConnection物件的配置都需要在connect()方法執行之前完成。
urlconn = (HttpsURLConnection)url.openConnection(); urlconn.setRequestMethod("GET"); urlconn.setConnectTimeout(5000); urlconn.setReadTimeout(5000); urlconn.setUseCaches(false); urlconn.connect();
3. HttpURLConnection是基於HTTP協議的,其底層通過socket通訊實現。如果不設定超時(timeout),在網路異常的情況下,可能會導致程式僵死而不繼續往下執行。
public HttpURLConnection(URL url, String s, int i){ this(url, new Proxy(java.net.Proxy.Type.HTTP, InetSocketAddress.createUnresolved(s, i))); }
4. HTTP正文的內容是通過OutputStream流寫入的, 向流中寫入的資料不會立即傳送到網路,而是存在於記憶體緩衝區中,待流關閉時,根據寫入的內容生成HTTP正文。
5. 呼叫getInputStream()方法時,返回一個輸入流,用於從中讀取伺服器對於HTTP請求的返回資訊。
InputStream inputStream = urlconn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); BufferedReader buff = new BufferedReader(inputStreamReader); String line = buff.readLine(); while(line != null){ System.out.println(line); line = buff.readLine(); } inputStream.close(); inputStreamReader.close(); buff.close();
6. 我們可以使用HttpURLConnection.connect()方法手動的傳送一個HTTP請求,但是如果要獲取HTTP響應的時候,請求就會自動的發起,比如我們使用HttpURLConnection.getInputStream()方法的時候,所以完全沒有必要呼叫connect()方法。
HttpClient 物件
HttpClient相比較來說簡化了HttpURLConnection物件對Session、Cookie的處理。
可以說HttpClient就是一個增強版的HttpURLConnection,HttpClient可以做HttpURLConnection物件所有能做的事。
HttpClient是Apache開源組織提供的它是一個簡單的HTTP客戶端,不是瀏覽器,用於傳送HTTP請求,接收HTTP響應。但不會快取伺服器的響應。它只是關注於如何傳送請求、接收響應,以及管理HTTP連線。
HttpClient的使用
使用HttpClient傳送請求、接收響應很簡單,只要如下幾步即可。
1. 建立HttpClient物件,CloseableHttpClient httpclient = HttpClients.createDefault();
2. 如果需要傳送GET請求,建立HttpGet物件;如果需要傳送POST請求,建立HttpPost物件。
3. 如果需要傳送請求引數,可呼叫HttpGet、HttpPost共同的setHeader()方法或者addHeader()方法來新增請求引數;對於HttpPost物件而言,也可呼叫setEntity(方法來設定請求引數。
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params); httpPost.setEntity(entity);
4. 呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,執行該方法返回一個HttpResponse。
5. 呼叫HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取伺服器的響應頭;呼叫HttpResponse的getEntity()方法可獲取HttpEntity物件,該物件包裝了伺服器的響應內容。程式可通過該物件獲取伺服器的響應內容。
HttpGet程式碼例項
public static void main(String[] args) throws Exception {
// 格式化請求url
// String cmd=String.format("http://%s:%[email protected]%s",username,password,split[1]);
// 請求地址
String url = "https://blog.csdn.net/amosjob/article/details/82775290";
// 建立預設的客戶端例項
CloseableHttpClient httpclient = HttpClients.createDefault();
// 建立get請求例項
HttpGet httpGet = new HttpGet(url);
// 設定頭部資訊
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
// httpGet.addHeader("x-api-key", "XXX");
// httpGet.addHeader("x-lang", "en-US");
// 執行GET請求 返回響應實體
HttpResponse response = httpclient.execute(httpGet);
// 獲取響應碼
int statusCode = response.getStatusLine().getStatusCode();
// 獲取全部的請求頭
Header[] allHeaders = response.getAllHeaders();
System.out.println("響應狀態碼:" + statusCode);
for (int i = 0; i < allHeaders.length; i++) {
System.out.println("全部的請求頭:" + allHeaders[i]);
}
// 獲取響應訊息實體
HttpEntity entity = response.getEntity();
//列印輸出網頁的內容(可刪除)
if (entity != null) {
// 推薦該辦法列印內容
System.out.println("響應的內容:"+EntityUtils.toString(entity));
// 也可以使用這個方法
InputStream inputStream = entity.getContent();
InputStreamReader streamReader = new InputStreamReader(inputStream);
int line;
line = streamReader.read() ;
while (line!= -1) {
System.out.print((char)line);
line = streamReader.read() ;
}
}
}
HttpPost程式碼例項
public static void main(String[] args) throws Exception {
// 請求地址
String url = "https://passport.csdn.net/account/login";
// 建立預設的客戶端例項
CloseableHttpClient httpclient = HttpClients.createDefault();
// 建立POST物件
HttpPost httpPost = new HttpPost(url);
// 傳引數
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", "admin"));
params.add(new BasicNameValuePair("password", "12345"));
try {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
httpPost.setEntity(entity);
} catch (Exception e) {
e.printStackTrace();
}
// 執行GET請求 返回響應實體
HttpResponse response = httpclient.execute(httpPost);
// 獲取響應碼
int statusCode = response.getStatusLine().getStatusCode();
// 獲取全部的請求頭
Header[] allHeaders = response.getAllHeaders();
System.out.println("響應狀態碼:" + statusCode);
for (int i = 0; i < allHeaders.length; i++) {
System.out.println("全部的請求頭:" + allHeaders[i]);
}
// 獲取響應訊息實體
HttpEntity entity = response.getEntity();
// 列印輸出網頁的內容(可刪除)
if (entity != null) {
System.out.println("響應的內容:"+EntityUtils.toString(entity));
}
}
相關HTTP協議詳解,請點選博主上篇文章連結