设为首页 收藏本站
查看: 358|回复: 0

[经验分享] 運用Apache HttpClient實作Get與Post動作

[复制链接]

尚未签到

发表于 2017-1-13 09:37:48 | 显示全部楼层 |阅读模式
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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-327795-1-1.html 上篇帖子: Maven创建项目: Failed to execute goal org.apache.maven.plugin( mvn archetype:create) 下篇帖子: apache 自带的ab.exe 测试网站的并发量(网站压力测试)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表