HttpClient 簡介 :
HTTP 協定是現在 Internet 上使用得最多、最重要的協定,越來越多的 Java 應用程序需要直接通過 HTTP 協定來訪問網路資源。雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協定的基本功能,但是對於大部分應用程序來說,JDK 類別庫本身提供的功能還不夠豐富和靈活。 HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效能、最新、功能豐富的支持 HTTP 協定的client端開發工具,並且它支持 HTTP 協定最新的版本和建議。 HttpClient 已經應用在很多的項目中,比如 Apache Jakarta 上很著名的另外兩個開源項目 Cactus 和 HTMLUnit 都使用了 HttpClient,更多使用 HttpClient 的應用可以參見http://wiki.apache.org/jakarta-httpclient/HttpClientPowered 。 HttpClient 項目非常活躍,使用的人還是非常多的。目前 HttpClient 正式版本是 3.1。
HttpClient 功能介紹
以下列出的是 HttpClient 提供的主要的功能,要知道更多詳細的功能可以參見 HttpClient 的主頁。
1. 實現了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
2. 支持自動轉向
3. 支持 HTTPS 協議
4. 支持代理服務器
下面將逐一介紹怎樣使用這些功能。首先,我們必須安裝好 HttpClient。
HttpClient 可以在http://hc.apache.org/downloads.cgi 下載
HttpClient用到了logging,你可以從這個地址http://commons.apache.org/downloads/download_logging.cgi 下載到 common-logging,從下載後的壓縮包中取出 commons-logging.jar 加到 CLASSPATH 中
HttpClient用到了codec,你可以從這個地址http://commons.apache.org/downloads/download_codec.cgi 下載到最新的 common-codec,從下載後的壓縮包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中
Get Method:
import java . io . IOException ;
import org . apache . commons . httpclient . * ;
import org . apache . commons . httpclient . methods . * ;
import org . apache . commons . httpclient . params . HttpMethodParams ;
public class HttpGet
{
private static String url = "http://www.apache.org/" ; // 目標網址.
public static void main(String [] args)
{
// 建立HttpClient實體.
HttpClient client = new HttpClient();
// 建立GetMethod實體, 並指派網址, GetMethod會自動處理該網轉址動作, 如果不想自動轉址請呼叫 setFollowRedirects(false).
GetMethod method = new GetMethod(url);
// 這段代碼用意為連接不到時自動重新??試三次.
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false ));
try {
// 返回狀態值.
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System .err.println("Method failed: " + method.getStatusLine());
}
// 取得回傳資訊.
byte [] responseBody = method.getResponseBody();
System .out.println(new String (responseBody));
} catch (HttpException httpexc) {
System .err.println("Fatal protocol violation: " + httpexc.getMessage());
httpexc.printStackTrace();
} catch (IOException ioexc) {System .err.println("Fatal transport error: " + ioexc.getMessage());
ioexc.printStackTrace();
} finally {
// ** 無論如何都必須釋放連接.
method.releaseConnection();
}
}
}
由於是執行在網路上的程序,運行executeMethod方法時,需要處理兩個異常,分別是HttpException和IOException。第一種異常的原因主要可能是在建立GetMethod的時候輸入網址錯誤,比如不小心將"http"寫成"htp",或者遠端返回的資訊內容不正常等,並且該異常發生是不可恢復的。
第二種異常一般是由於網路原因引起的異常,對於這種異常 (IOException),HttpClient會根據你指定的恢復策略自動試著重新執行executeMethod方法。
HttpClient的恢復策略可以自定義(通過實現接口HttpMethodRetryHandler來實現)。通過httpClient的方法 setParameter設置你實現的恢復策略,這裡使用的是系統提供的預設恢復方式,該方式在碰到第二類異常的時候將自動重試3次。
executeMethod返回值是一個整數,表示了執行該方法後服務器返回的狀態碼,該狀態碼能表示出該方法執行是否成功、需要認證或者頁面轉址(預設狀態下GetMethod是自動處理轉址)等。
POST Method:
import java . io . IOException ;
import org . apache . commons . httpclient . * ;
import org . apache . commons . httpclient . methods . * ;
public class HttpPost
{
private static String url = "http://www.apache.org/" ; // 目標網址.
public static void main(String [] args)
{
// 建立HttpClient實體.
HttpClient client = new HttpClient();
// 建立PostMethod實體, 並指派網址
PostMethod post = new PostMethod(url);
// 建立NameValuePair陣列?儲欲傳送的資料, 對照為 (名稱, 內容)
NameValuePair[] data = { new NameValuePair("Name" , "Sam Wang" ), new NameValuePair("Passwd" , "Test1234" ) };
// 將NameValuePair陣列設置到請求內容中
post.setRequestBody(data);
try {
// 返回狀態值.
int statusCode = client.executeMethod(post);
if (statusCode != HttpStatus.SC_OK) {
System .err.println("Method failed: " + post.getStatusLine());
}
// 取得回傳資訊.
byte [] responseBody = post.getResponseBody();
System .out.println(new String (responseBody));
} catch (HttpException httpexc) {
System .err.println("Fatal protocol violation: " + httpexc.getMessage());
httpexc.printStackTrace();
} catch (IOException ioexc) {
System .err.println("Fatal transport error: " + ioexc.getMessage());
ioexc.printStackTrace();
} finally {
// ** 無論如何都必須釋放連接.
post.releaseConnection();
}
}
}
PostMethod運作重點大致上和GetMethod相同, 唯一不同的是傳送變數必須用NameValuePair[]陣列儲存, 再設置到requestBody中。
HttpClient 3_configuration
想多了解的人, 當然, 自己多看看 Java Doc 囉.
以下列出幾個常用的.
1. Add Headers
GetMethod method = new GetMethod();
method.addRequestHeader("headerName", "headerValue");
// or
method.addRequestHeader(new Header("headerName", "headerValue"));
2. 設定 timeout 時間
HttpMethodParams params = new HttpMethodParams();
params.setSoTimeout(3000);
// or
method.getParams().setSoTimeout(3000);
3. 多執行序下使用 HttpClient
HttpClient client = new HttpClient(new MultiThreadedHt tpConnectionManager());
// or
MultiThreadedHttpConnectionManager config = new MultiThreadedHttpConnectionManager());
// set other config
HttpClient client = new HttpClient();
client.setHttpConnectionManager(config);
補充: 如果您的程式會一直使用 httpclient 發送 request, 建意將 httpclient 宣告成只有一份(ex: static or singleton), 減少不必要要的 port 被開啟, 又要等待 system close.
4. 失敗時, retry 3 次
// set per default
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
// or
DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler(10, true);
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);
// 如果想了解哪些情況下, 才會 retry, 請參考官網 http://hc.apache.org/httpclient-3.x/tutorial.html
目前這些囉, 有想到什麼常用的到時候再補充唷.
http://www.diybl.com/course/3_program/java/javajs/20090918/175773_3.html
分享到:
相关推荐
在Java应用程序中,如果你需要与Web服务器进行交互,发送GET、POST或者其他HTTP方法的请求,HttpClient是一个非常理想的工具。 HttpClient 4.2.5是该库的一个稳定版本,它包含了多项改进和修复,以提高性能和稳定性...
HttpClient是Apache基金会开发的一个HTTP客户端库,用于在Java应用程序中执行HTTP请求。它提供了丰富的API,使得开发者可以方便地发送HTTP请求(包括POST和GET)并处理响应,同时还支持文件的上传和下载功能。本文将...
这个jar包是Apache HttpClient的核心组件,广泛应用于各种Java应用程序,尤其是那些需要与Web服务进行交互的场景。 在Apache HttpClient中,你可以: 1. **创建HTTP请求**:HttpClient允许你轻松地构造GET、POST...
Apache HttpClient 是一个强大的Java库,用于执行HTTP请求。在4.5.12版本中,它提供了丰富的功能,包括支持HTTP/1.1和部分HTTP/2协议,连接管理,重试策略,以及多种认证机制。这个源码版本是学习HTTP通信、网络编程...
- 在Eclipse 中,你可以通过"File" -> "Import" -> "Existing Projects into Workspace" 导入Apache HttpClient 4.5 的源代码项目。 - 将下载的压缩包解压,然后在导入对话框中选择解压后的目录,确保"Copy ...
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 ...通过上述示例和解释,你应该能够理解和掌握如何使用Java HttpClient库来发送GET和POST请求,这对于开发Web应用程序或与API接口交互至关重要。
3. **线程安全与并发**:HttpClient考虑了多线程环境下的使用,它提供了线程安全的连接管理和请求执行机制。研究源码可以帮助我们理解如何在高并发环境下正确地使用HttpClient。 4. **错误处理**:通过源码,我们...
总结,HttpClientUtil 是一个方便的工具类,封装了 Apache HttpClient 库,简化了 HTTP 请求的发送,特别是对于 GET 和 POST 请求。它使用了 Fastjson 和 Guava 库来处理数据的序列化和集合操作,提高了代码的可读性...
这篇博客"Apache HttpClient Demo"可能详细介绍了如何使用这个库来发起HTTP请求,包括GET、POST以及其他HTTP方法。 在HttpClient中,首先需要创建一个HttpClient实例。这是基础的HTTP客户端,将负责发送请求并接收...
接下来,我们讨论如何使用HttpClient进行GET请求。GET请求通常用于获取资源,不涉及请求体: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...
在Java编程中,Apache HttpClient库是一个非常常用的工具,它提供了对HTTP协议的强大支持,包括GET和POST请求。本文将深入探讨如何使用HttpClient进行GET和POST请求,并提供相关的代码示例。 首先,GET请求是最常见...
在Java编程中,Apache HttpClient库是一个非常常用的工具,用于执行HTTP请求,如GET和POST,以获取或提交网络上的数据。HttpClient提供了丰富的功能,包括设置请求头、处理重定向、管理连接池等,使得开发者可以高效...
在实际开发中,Apache HttpClient还可以与其他Apache工具类一起使用,如Apache Commons Lang、Apache Commons IO等,它们提供了各种实用的辅助函数,可以增强HttpClient的功能和易用性。例如,Lang库可以帮助处理...
这个压缩包可能包含了实现HTTP GET和POST请求所需的jar包以及示例代码,帮助开发者理解如何使用HttpClient进行网络通信。下面将详细介绍HttpClient库,HTTP请求的基本概念,以及GET和POST方法的差异。 HttpClient是...
它是Apache软件基金会的Jakarta项目的一部分,被广泛用于开发需要与Web服务器交互的应用程序。在本文中,我们将深入探讨HttpClient的核心概念、主要功能以及如何使用它来实现网络爬虫。 **HttpClient 主要特点** 1...
Apache HttpClient库是Apache软件基金会的一个项目,它提供了对HTTP协议的全面支持,包括GET、POST、PUT等HTTP方法,以及处理cookies、重定向、身份验证等功能。 描述中提到的三个JAR文件分别是: 1. **commons-...