天天看点

HttpClient3.1

from: http://cn-done.iteye.com/blog/1051861

HTTP 鍗忚鍙兘鏄幇鍦?Internet 涓婁娇鐢ㄥ緱鏈€澶氥€佹渶閲嶈鐨勫崗璁簡锛岃秺鏉ヨ秺澶氱殑 Java 搴旂敤绋嬪簭闇€瑕佺洿鎺ラ€氳繃 HTTP鍗忚鏉ヨ闂綉缁滆祫婧愩€傝櫧鐒跺湪 JDK 鐨?java.net 鍖呬腑宸茬粡鎻愪緵浜嗚闂?HTTP 鍗忚鐨勫熀鏈姛鑳斤紝浣嗘槸瀵逛簬澶ч儴鍒嗗簲鐢ㄧ▼搴忔潵璇达紝JDK搴撴湰韬彁渚涚殑鍔熻兘杩樹笉澶熶赴瀵屽拰鐏垫椿銆侶ttpClient 鏄?Apache Jakarta Common涓嬬殑瀛愰」鐩紝鐢ㄦ潵鎻愪緵楂樻晥鐨勩€佹渶鏂扮殑銆佸姛鑳戒赴瀵岀殑鏀寔 HTTP 鍗忚鐨勫鎴风缂栫▼宸ュ叿鍖咃紝骞朵笖瀹冩敮鎸?HTTP鍗忚鏈€鏂扮殑鐗堟湰鍜屽缓璁€侶ttpClient 宸茬粡搴旂敤鍦ㄥ緢澶氱殑椤圭洰涓紝姣斿 Apache Jakarta 涓婂緢钁楀悕鐨勫彟澶栦袱涓紑婧愰」鐩瓹actus 鍜?HTMLUnit 閮戒娇鐢ㄤ簡 HttpClient锛屾洿澶氫娇鐢?HttpClient 鐨勫簲鐢ㄥ彲浠ュ弬瑙乭ttp://wiki.apache.org/jakarta-httpclient/HttpClientPowered銆侶ttpClient 椤圭洰闈炲父娲昏穬锛屼娇鐢ㄧ殑浜鸿繕鏄潪甯稿鐨勩€傜洰鍓?HttpClient 鐗堟湰鏄湪 2005.10.11 鍙戝竷鐨?3.0 RC4 銆?

锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞

搴旂敤HttpClient鏉ュ浠樺悇绉嶉〗鍥虹殑WEB鏈嶅姟鍣? 杞嚜锛歨ttp://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx

涓€鑸殑鎯呭喌涓嬫垜浠兘鏄娇鐢↖E鎴栬€匩avigator娴忚鍣ㄦ潵璁块棶涓€涓猈EB鏈嶅姟鍣紝鐢ㄦ潵娴忚椤甸潰鏌ョ湅淇℃伅鎴栬€呮彁浜や竴浜涙暟鎹瓑绛夈€傛墍璁块棶鐨勮繖浜涢〉闈㈡湁鐨勪粎浠呮槸涓€浜涙櫘閫氱殑椤甸潰锛屾湁鐨勯渶瑕佺敤鎴风櫥褰曞悗鏂瑰彲浣跨敤锛屾垨鑰呴渶瑕佽璇佷互鍙婃槸涓€浜涢€氳繃鍔犲瘑鏂瑰紡浼犺緭锛屼緥濡侶TTPS銆傜洰鍓嶆垜浠娇鐢ㄧ殑娴忚鍣ㄥ鐞嗚繖浜涙儏鍐甸兘涓嶄細鏋勬垚闂銆備笉杩囦綘鍙兘鍦ㄦ煇浜涙椂鍊欓渶瑕侀€氳繃绋嬪簭鏉ヨ闂繖鏍风殑涓€浜涢〉闈紝姣斿浠庡埆浜虹殑缃戦〉涓€滃伔鈥濅竴浜涙暟鎹紱鍒╃敤鏌愪簺绔欑偣鎻愪緵鐨勯〉闈㈡潵瀹屾垚鏌愮鍔熻兘锛屼緥濡傝鎴戜滑鎯崇煡閬撴煇涓墜鏈哄彿鐮佺殑褰掑睘鍦拌€屾垜浠嚜宸卞張娌℃湁杩欐牱鐨勬暟鎹紝鍥犳鍙ソ鍊熷姪鍏朵粬鍏徃宸叉湁鐨勭綉绔欐潵瀹屾垚杩欎釜鍔熻兘锛岃繖涓椂鍊欐垜浠渶瑕佸悜缃戦〉鎻愪氦鎵嬫満鍙风爜骞朵粠杩斿洖鐨勯〉闈腑瑙f瀽鍑烘垜浠兂瑕佺殑鏁版嵁鏉ャ€傚鏋滃鏂逛粎浠呮槸涓€涓緢绠€鍗曠殑椤甸潰锛岄偅鎴戜滑鐨勭▼搴忎細寰堢畝鍗曪紝鏈枃涔熷氨娌℃湁蹇呰澶у紶鏃楅紦鐨勫湪杩欓噷娴垂鍙h垖銆備絾鏄€冭檻鍒颁竴浜涙湇鍔℃巿鏉冪殑闂锛屽緢澶氬叕鍙告彁渚涚殑椤甸潰寰€寰€骞朵笉鏄彲浠ラ€氳繃涓€涓畝鍗曠殑URL灏卞彲浠ヨ闂殑锛岃€屽繀椤荤粡杩囨敞鍐岀劧鍚庣櫥褰曞悗鏂瑰彲浣跨敤鎻愪緵鏈嶅姟鐨勯〉闈紝杩欎釜鏃跺€欏氨娑夊強鍒癈OOKIE闂鐨勫鐞嗐€傛垜浠煡閬撶洰鍓嶆祦琛岀殑鍔ㄦ€佺綉椤垫妧鏈緥濡侫SP銆丣SP鏃犱笉鏄€氳繃COOKIE鏉ュ鐞嗕細璇濅俊鎭殑銆備负浜嗕娇鎴戜滑鐨勭▼搴忚兘浣跨敤鍒汉鎵€鎻愪緵鐨勬湇鍔¢〉闈紝灏辫姹傜▼搴忛鍏堢櫥褰曞悗鍐嶈闂湇鍔¢〉闈紝杩欒繃绋嬪氨闇€瑕佽嚜琛屽鐞哻ookie锛屾兂鎯冲綋浣犵敤java.net.HttpURLConnection鏉ュ畬鎴愯繖浜涘姛鑳芥椂鏄涔堟亹鎬栫殑浜嬫儏鍟婏紒鍐典笖杩欎粎浠呮槸鎴戜滑鎵€璇寸殑椤藉浐鐨刉EB鏈嶅姟鍣ㄤ腑鐨勪竴涓緢甯歌鐨勨€滈〗鍥衡€濓紒鍐嶆湁濡傞€氳繃HTTP鏉ヤ笂浼犳枃浠跺憿锛熶笉闇€瑕佸ご鐤硷紝杩欎簺闂鏈変簡鈥滃畠鈥濆氨寰堝鏄撹В鍐充簡锛?

鎴戜滑涓嶅彲鑳藉垪涓炬墍鏈夊彲鑳界殑椤藉浐锛屾垜浠細閽堝鍑犵鏈€甯歌鐨勯棶棰樿繘琛屽鐞嗐€傚綋鐒朵簡锛屾濡傚墠闈㈣鍒扮殑锛屽鏋滄垜浠嚜宸变娇鐢╦ava.net.HttpURLConnection鏉ユ悶瀹氳繖浜涢棶棰樻槸寰堟亹鎬栫殑浜嬫儏锛屽洜姝ゅ湪寮€濮嬩箣鍓嶆垜浠厛瑕佷粙缁嶄竴涓嬩竴涓紑鏀炬簮鐮佺殑椤圭洰锛岃繖涓」鐩氨鏄疉pache寮€婧愮粍缁囦腑鐨刪ttpclient锛屽畠闅跺睘浜嶫akarta鐨刢ommons椤圭洰锛岀洰鍓嶇殑鐗堟湰鏄?.0RC2銆俢ommons涓嬫湰鏉ュ凡缁忔湁涓€涓猲et鐨勫瓙椤圭洰锛屼絾鏄張鎶奾ttpclient鍗曠嫭鎻愬嚭鏉ワ紝鍙http鏈嶅姟鍣ㄧ殑璁块棶缁濋潪鏄撲簨銆?

Commons-httpclient椤圭洰灏辨槸涓撻棬璁捐鏉ョ畝鍖朒TTP瀹㈡埛绔笌鏈嶅姟鍣ㄨ繘琛屽悇绉嶉€氳缂栫▼銆傞€氳繃瀹冨彲浠ヨ鍘熸潵寰堝ご鐤肩殑浜嬫儏鐜板湪杞绘澗鐨勮В鍐筹紝渚嬪浣犱笉鍐嶇鏄疕TTP鎴栬€匟TTPS鐨勯€氳鏂瑰紡锛屽憡璇夊畠浣犳兂浣跨敤HTTPS鏂瑰紡锛屽墿涓嬬殑浜嬫儏浜ょ粰httpclient鏇夸綘瀹屾垚銆傛湰鏂囦細閽堝鎴戜滑鍦ㄧ紪鍐橦TTP瀹㈡埛绔▼搴忔椂缁忓父纰板埌鐨勫嚑涓棶棰樿繘琛屽垎鍒粙缁嶅浣曚娇鐢╤ttpclient鏉ヨВ鍐冲畠浠紝涓轰簡璁╄鑰呮洿蹇殑鐔熸倝杩欎釜椤圭洰鎴戜滑鏈€寮€濮嬪厛缁欏嚭涓€涓畝鍗曠殑渚嬪瓙鏉ヨ鍙栦竴涓綉椤电殑鍐呭锛岀劧鍚庡惊搴忔笎杩涜В鍐虫帀鍓嶈繘涓殑鎵€鏈夐棶棰樸€?

1锛?璇诲彇缃戦〉(HTTP/HTTPS)鍐呭

涓嬮潰鏄垜浠粰鍑虹殑涓€涓畝鍗曠殑渚嬪瓙鐢ㄦ潵璁块棶鏌愪釜椤甸潰

package http.demo;

import java.io.IOException;

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.methods.*;

public class SimpleClient {

public static void main(String[] args) throws IOException

{

聽 HttpClient client = new HttpClient();

聽聽聽聽聽 // 璁剧疆浠g悊鏈嶅姟鍣ㄥ湴鍧€鍜岀鍙B犅犅犅犅?

聽聽聽聽聽 //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);

聽聽聽聽聽 // 浣跨敤 GET 鏂规硶 锛屽鏋滄湇鍔″櫒闇€瑕侀€氳繃 HTTPS 杩炴帴锛岄偅鍙渶瑕佸皢涓嬮潰 URL 涓殑 http 鎹㈡垚 https

聽聽聽聽聽聽聽聽 HttpMethodmethod=newGetMethod("http://java.sun.com");

聽聽聽聽聽 //浣跨敤POST鏂规硶

聽聽聽聽聽 //HttpMethod method = new PostMethod("http://java.sun.com");

聽聽聽聽聽 client.executeMethod(method);

聽聽聽聽聽 //鎵撳嵃鏈嶅姟鍣ㄨ繑鍥炵殑鐘舵€? 聽聽聽聽聽聽 System.out.println(method.getStatusLine());

聽聽聽聽聽 //鎵撳嵃杩斿洖鐨勪俊鎭? 聽聽聽聽聽 System.out.println(method.getResponseBodyAsString());

聽聽聽聽聽 //閲婃斁杩炴帴

聽聽聽聽聽 method.releaseConnection();

聽聽 }

}

鍦ㄨ繖涓緥瀛愪腑棣栧厛鍒涘缓涓€涓狧TTP瀹㈡埛绔?HttpClient)鐨勫疄渚嬶紝鐒跺悗閫夋嫨鎻愪氦鐨勬柟娉曟槸GET鎴栬€匬OST锛屾渶鍚庡湪HttpClient瀹炰緥涓婃墽琛屾彁浜ょ殑鏂规硶锛屾渶鍚庝粠鎵€閫夋嫨鐨勬彁浜ゆ柟娉曚腑璇诲彇鏈嶅姟鍣ㄥ弽棣堝洖鏉ョ殑缁撴灉銆傝繖灏辨槸浣跨敤HttpClient鐨勫熀鏈祦绋嬨€傚叾瀹炵敤涓€琛屼唬鐮佷篃灏卞彲浠ユ悶瀹氭暣涓姹傜殑杩囩▼锛岄潪甯哥殑绠€鍗曪紒

2锛?浠ET鎴栬€匬OST鏂瑰紡鍚戠綉椤垫彁浜ゅ弬鏁?

鍏跺疄鍓嶉潰涓€涓渶绠€鍗曠殑绀轰緥涓垜浠凡缁忎粙缁嶄簡濡備綍浣跨敤GET鎴栬€匬OST鏂瑰紡鏉ヨ姹備竴涓〉闈紝鏈皬鑺備笌涔嬩笉鍚岀殑鏄浜嗘彁浜ゆ椂璁惧畾椤甸潰鎵€闇€鐨勫弬鏁帮紝鎴戜滑鐭ラ亾濡傛灉鏄疓ET鐨勮姹傛柟寮忥紝閭d箞鎵€鏈夊弬鏁伴兘鐩存帴鏀惧埌椤甸潰鐨刄RL鍚庨潰鐢ㄩ棶鍙蜂笌椤甸潰鍦板潃闅斿紑锛屾瘡涓弬鏁扮敤&闅斿紑锛屼緥濡傦細http://java.sun.com/?name=liudong&mobile=123456锛屼絾鏄綋浣跨敤POST鏂规硶鏃跺氨浼氱◢寰湁涓€鐐圭偣楹荤儲銆傛湰灏忚妭鐨勪緥瀛愭紨绀哄悜濡備綍鏌ヨ鎵嬫満鍙风爜鎵€鍦ㄧ殑鍩庡競锛屼唬鐮佸涓嬶細

package http.demo;

import java.io.IOException;

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.methods.*;

public class SimpleHttpClient {

聽聽 public static void main(String[] args) throws IOException {

聽聽聽聽聽 HttpClient client = new HttpClient();

聽聽聽聽聽 client.getHostConfiguration().setHost( "www.imobile.com.cn" , 80, "http" );

聽聽聽聽聽 method = getPostMethod();聽聽聽 // 浣跨敤 POST 鏂瑰紡鎻愪氦鏁版嵁

聽聽聽聽聽 client.executeMethod(method);聽聽 //鎵撳嵃鏈嶅姟鍣ㄨ繑鍥炵殑鐘舵€?

聽聽聽聽聽 System.out.println(method.getStatusLine());聽聽 //鎵撳嵃缁撴灉椤甸潰

聽聽聽聽聽 Stringresponse=newString(method.getResponseBodyAsString().getBytes("8859_1"));

聽聽聽聽聽 //鎵撳嵃杩斿洖鐨勪俊鎭? 聽聽聽聽聽 System.out.println(response);

聽聽聽聽聽 method.releaseConnection();

聽聽 }

聽聽

聽聽 privatestaticHttpMethodgetGetMethod(){

聽聽聽聽聽 returnnewGetMethod("/simcard.php?simcard=1330227");

聽聽 }

聽聽聽

聽聽聽 private static HttpMethod getPostMethod(){

聽聽聽聽聽 PostMethod post = new PostMethod( "/simcard.php" );

聽聽聽聽聽 NameValuePair simcard = new NameValuePair( "simcard" , "1330227" );

聽聽聽聽聽 post.setRequestBody( new NameValuePair[] { simcard});

聽聽聽聽聽 return post;

聽聽 }

}

鍦ㄤ笂闈㈢殑渚嬪瓙涓〉闈ttp://www.imobile.com.cn/simcard.php闇€瑕佷竴涓弬鏁版槸simcard锛岃繖涓弬鏁板€间负鎵嬫満鍙风爜娈碉紝鍗虫墜鏈哄彿鐮佺殑鍓嶄竷浣嶏紝鏈嶅姟鍣ㄤ細杩斿洖鎻愪氦鐨勬墜鏈哄彿鐮佸搴旂殑鐪佷唤銆佸煄甯備互鍙婂叾浠栬缁嗕俊鎭€侴ET鐨勬彁浜ゆ柟娉曞彧闇€瑕佸湪URL鍚庡姞鍏ュ弬鏁颁俊鎭紝鑰孭OST鍒欓渶瑕侀€氳繃NameValuePair绫绘潵璁剧疆鍙傛暟鍚嶇О鍜屽畠鎵€瀵瑰簲鐨勫€笺€?

3锛?澶勭悊椤甸潰閲嶅畾鍚?

鍦↗SP/Servlet缂栫▼涓璻esponse.sendRedirect鏂规硶灏辨槸浣跨敤HTTP鍗忚涓殑閲嶅畾鍚戞満鍒躲€傚畠涓嶫SP涓殑<jsp:forward鈥?gt;鐨勫尯鍒湪浜庡悗鑰呮槸鍦ㄦ湇鍔″櫒涓疄鐜伴〉闈㈢殑璺宠浆锛屼篃灏辨槸璇村簲鐢ㄥ鍣ㄥ姞杞戒簡鎵€瑕佽烦杞殑椤甸潰鐨勫唴瀹瑰苟杩斿洖缁欏鎴风锛涜€屽墠鑰呮槸杩斿洖涓€涓姸鎬佺爜锛岃繖浜涚姸鎬佺爜鐨勫彲鑳藉€艰涓嬭〃锛岀劧鍚庡鎴风璇诲彇闇€瑕佽烦杞埌鐨勯〉闈㈢殑URL骞堕噸鏂板姞杞芥柊鐨勯〉闈€傚氨鏄繖鏍蜂竴涓繃绋嬶紝鎵€浠ユ垜浠紪绋嬬殑鏃跺€欏氨瑕侀€氳繃HttpMethod.getStatusCode()鏂规硶鍒ゆ柇杩斿洖鍊兼槸鍚︿负涓嬭〃涓殑鏌愪釜鍊兼潵鍒ゆ柇鏄惁闇€瑕佽烦杞€傚鏋滃凡缁忕‘璁ら渶瑕佽繘琛岄〉闈㈣烦杞簡锛岄偅涔堝彲浠ラ€氳繃璇诲彇HTTP澶翠腑鐨刲ocation灞炴€ф潵鑾峰彇鏂扮殑鍦板潃銆?

鐘舵€佺爜

瀵瑰簲 HttpServletResponse 鐨勫父閲? 璇︾粏鎻忚堪

301聽 SC_MOVED_PERMANENTLY聽 椤甸潰宸茬粡姘镐箙绉诲埌鍙﹀涓€涓柊鍦板潃

302聽 SC_MOVED_TEMPORARILY聽 聽椤甸潰鏆傛椂绉诲姩鍒板彟澶栦竴涓柊鐨勫湴鍧€

303聽 SC_SEE_OTHER 瀹㈡埛绔姹傜殑鍦板潃蹇呴』閫氳繃鍙﹀鐨?URL 鏉ヨ闂? 307聽 SC_TEMPORARY_REDIRECT 鍚?SC_MOVED_TEMPORARILY

涓嬮潰鐨勪唬鐮佺墖娈垫紨绀哄浣曞鐞嗛〉闈㈢殑閲嶅畾鍚?

client.executeMethod(post);

System.out.println(post.getStatusLine().toString());

post.releaseConnection();

// 妫€鏌ユ槸鍚﹂噸瀹氬悜

int statuscode = post.getStatusCode();

if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) || (statuscode ==HttpStatus.SC_MOVED_PERMANENTLY) || (statuscode ==HttpStatus.SC_SEE_OTHER) || (statuscode ==HttpStatus.SC_TEMPORARY_REDIRECT)) {

// 璇诲彇鏂扮殑 URL 鍦板潃

聽聽 Headerheader=post.getResponseHeader("location");

聽聽 if (header!=null){

聽聽聽聽聽 Stringnewuri=header.getValue();

聽聽聽聽聽 if((newuri==null)||(newuri.equals("")))

聽聽聽聽聽聽聽聽 newuri="/";

聽聽聽聽聽聽聽聽 GetMethodredirect=newGetMethod(newuri);

聽聽聽聽聽聽聽聽 client.executeMethod(redirect);

聽聽聽聽聽聽聽聽 System.out.println("Redirect:"+redirect.getStatusLine().toString());

聽聽聽聽聽聽聽聽 redirect.releaseConnection();

聽聽 }else

聽聽聽 System.out.println("Invalid redirect");

}

鎴戜滑鍙互鑷缂栧啓涓や釜JSP椤甸潰锛屽叾涓竴涓〉闈㈢敤response.sendRedirect鏂规硶閲嶅畾鍚戝埌鍙﹀涓€涓〉闈㈢敤鏉ユ祴璇曚笂闈㈢殑渚嬪瓙銆?

4锛?妯℃嫙杈撳叆鐢ㄦ埛鍚嶅拰鍙d护杩涜鐧诲綍锛堝彲鐢ㄤ綔SSO锛?

鏈皬鑺傚簲璇ヨ鏄疕TTP瀹㈡埛绔紪绋嬩腑鏈€甯哥瑙佺殑闂锛屽緢澶氱綉绔欑殑鍐呭閮藉彧鏄娉ㄥ唽鐢ㄦ埛鍙鐨勶紝杩欑鎯呭喌涓嬪氨蹇呴』瑕佹眰浣跨敤姝g‘鐨勭敤鎴峰悕鍜屽彛浠ょ櫥褰曟垚鍔熷悗锛屾柟鍙祻瑙堝埌鎯宠鐨勯〉闈€傚洜涓篐TTP鍗忚鏄棤鐘舵€佺殑锛屼篃灏辨槸杩炴帴鐨勬湁鏁堟湡鍙檺浜庡綋鍓嶈姹傦紝璇锋眰鍐呭缁撴潫鍚庤繛鎺ュ氨鍏抽棴浜嗐€傚湪杩欑鎯呭喌涓嬩负浜嗕繚瀛樼敤鎴风殑鐧诲綍淇℃伅蹇呴』浣跨敤鍒癈ookie鏈哄埗銆備互JSP/Servlet涓轰緥锛屽綋娴忚鍣ㄨ姹備竴涓狫SP鎴栬€呮槸Servlet鐨勯〉闈㈡椂锛屽簲鐢ㄦ湇鍔″櫒浼氳繑鍥炰竴涓弬鏁帮紝鍚嶄负jsessionid锛堝洜涓嶅悓搴旂敤鏈嶅姟鍣ㄨ€屽紓锛夛紝鍊兼槸涓€涓緝闀跨殑鍞竴瀛楃涓茬殑Cookie锛岃繖涓瓧绗︿覆鍊间篃灏辨槸褰撳墠璁块棶璇ョ珯鐐圭殑浼氳瘽鏍囪瘑銆傛祻瑙堝櫒鍦ㄦ瘡璁块棶璇ョ珯鐐圭殑鍏朵粬椤甸潰鏃跺€欓兘瑕佸甫涓妀sessionid杩欐牱鐨凜ookie淇℃伅锛屽簲鐢ㄦ湇鍔″櫒鏍规嵁璇诲彇杩欎釜浼氳瘽鏍囪瘑鏉ヨ幏鍙栧搴旂殑浼氳瘽淇℃伅銆?

瀵逛簬闇€瑕佺敤鎴风櫥褰曠殑缃戠珯锛屼竴鑸湪鐢ㄦ埛鐧诲綍鎴愬姛鍚庝細灏嗙敤鎴疯祫鏂欎繚瀛樺湪鏈嶅姟鍣ㄧ殑浼氳瘽涓紝杩欐牱褰撹闂埌鍏朵粬鐨勯〉闈㈡椂鍊欙紝搴旂敤鏈嶅姟鍣ㄦ牴鎹祻瑙堝櫒閫佷笂鐨凜ookie涓鍙栧綋鍓嶈姹傚搴旂殑浼氳瘽鏍囪瘑浠ヨ幏寰楀搴旂殑浼氳瘽淇℃伅锛岀劧鍚庡氨鍙互鍒ゆ柇鐢ㄦ埛璧勬枡鏄惁瀛樺湪浜庝細璇濅俊鎭腑锛屽鏋滃瓨鍦ㄥ垯鍏佽璁块棶椤甸潰锛屽惁鍒欒烦杞埌鐧诲綍椤甸潰涓姹傜敤鎴疯緭鍏ュ笎鍙峰拰鍙d护杩涜鐧诲綍銆傝繖灏辨槸涓€鑸娇鐢↗SP寮€鍙戠綉绔欏湪澶勭悊鐢ㄦ埛鐧诲綍鐨勬瘮杈冮€氱敤鐨勬柟娉曘€?

杩欐牱涓€鏉ワ紝瀵逛簬HTTP鐨勫鎴风鏉ヨ锛屽鏋滆璁块棶涓€涓彈淇濇姢鐨勯〉闈㈡椂灏卞繀椤绘ā鎷熸祻瑙堝櫒鎵€鍋氱殑宸ヤ綔锛岄鍏堝氨鏄姹傜櫥褰曢〉闈紝鐒跺悗璇诲彇Cookie鍊硷紱鍐嶆璇锋眰鐧诲綍椤甸潰骞跺姞鍏ョ櫥褰曢〉鎵€闇€鐨勬瘡涓弬鏁帮紱鏈€鍚庡氨鏄姹傛渶缁堟墍闇€鐨勯〉闈€傚綋鐒跺湪闄ょ涓€娆¤姹傚鍏朵粬鐨勮姹傞兘闇€瑕侀檮甯︿笂Cookie淇℃伅浠ヤ究鏈嶅姟鍣ㄨ兘鍒ゆ柇褰撳墠璇锋眰鏄惁宸茬粡閫氳繃楠岃瘉銆傝浜嗚繖涔堝锛屽彲鏄鏋滀綘浣跨敤httpclient鐨勮瘽锛屼綘鐢氳嚦杩炰竴琛屼唬鐮侀兘鏃犻渶澧炲姞锛屼綘鍙渶瑕佸厛浼犻€掔櫥褰曚俊鎭墽琛岀櫥褰曡繃绋嬶紝鐒跺悗鐩存帴璁块棶鎯宠鐨勯〉闈紝璺熻闂竴涓櫘閫氱殑椤甸潰娌℃湁浠讳綍鍖哄埆锛屽洜涓虹被HttpClient宸茬粡甯綘鍋氫簡鎵€鏈夎鍋氱殑浜嬫儏浜嗭紝澶浜嗭紒涓嬮潰鐨勪緥瀛愬疄鐜颁簡杩欐牱涓€涓闂殑杩囩▼銆?

package http.demo;

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.cookie.*;

import org.apache.commons.httpclient.methods.*;

public class FormLoginDemo {

聽聽 public聽 void聽 singleLogin(HttpServletRequest request,

聽聽聽HttpServletResponse response) {

聽try {

聽聽聽 String LOGON_SITE = "localhost";

聽聽聽 int LOGON_PORT =聽 8080;

聽聽聽 HttpClient client = new HttpClient();

聽聽聽聽聽聽 client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);

聽聽聽聽聽聽 // 妯℃嫙鐧诲綍椤甸潰 login.jsp->main.jsp

聽聽聽聽聽聽 PostMethod post = new PostMethod( "http://localhost:8080/idream/jspringsecuritycheck.do" );

聽聽聽聽聽聽 NameValuePair name = new NameValuePair( "j_username" , "admin" );

聽聽聽聽聽聽 NameValuePair pass = new NameValuePair( "j_password" , "111111" );

聽聽聽聽聽聽 post.setRequestBody( new NameValuePair[]{name,pass});

聽聽聽聽聽聽 int status = client.executeMethod(post);

聽聽聽聽聽聽 System.out.println(post.getResponseBodyAsString());

聽聽聽聽聽聽 post.releaseConnection();

聽聽聽聽聽聽 // 鏌ョ湅 cookie 淇℃伅

聽聽聽聽聽聽 CookieSpec cookiespec = CookiePolicy.getDefaultSpec();

聽聽聽聽聽聽 Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/idream" , false , client.getState().getCookies());

聽聽聽聽聽聽 if (cookies.length == 0) {

聽聽 System.out.println( "None" );

聽聽聽聽聽聽 } else {

聽聽 for ( int i = 0; i < cookies.length; i++) {

聽聽聽聽聽 System.out.println("cookies["+i+"]"+cookies[i].toString());

聽聽 }

聽聽聽聽聽聽 }

聽聽聽聽聽 //聽 璁块棶鎵€闇€鐨勯〉闈?/idream/account/list.do

聽聽聽聽聽聽 GetMethod get=new GetMethod("http://localhost:8080/idream/account/list.do");

聽聽聽聽聽聽 client.executeMethod(get);

聽聽聽聽聽聽 String str = get.getResponseBodyAsString();

聽聽聽聽聽聽 //InputStream buffer = get.getResponseBodyAsStream();

聽聽聽聽聽聽 get.releaseConnection();

聽聽聽聽聽聽

聽聽聽聽聽聽 PrintWriter out = null;

聽聽聽out = response.getWriter();

聽聽聽out.write(str);

聽聽聽out.flush();

聽聽聽out.close();

聽聽聽聽聽

聽} catch (IOException e) {

聽聽e.printStackTrace();

聽}

聽}

}

5锛?鎻愪氦XML鏍煎紡鍙傛暟

鎻愪氦XML鏍煎紡鐨勫弬鏁板緢绠€鍗曪紝浠呬粎鏄竴涓彁浜ゆ椂鍊欑殑ContentType闂锛屼笅闈㈢殑渚嬪瓙婕旂ず浠庢枃浠舵枃浠朵腑璇诲彇XML淇℃伅骞舵彁浜ょ粰鏈嶅姟鍣ㄧ殑杩囩▼锛岃杩囩▼鍙互鐢ㄦ潵娴嬭瘯Web鏈嶅姟銆?

import java.io.File;

import java.io.FileInputStream;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.methods.EntityEnclosingMethod;

import org.apache.commons.httpclient.methods.PostMethod;

public class PostXMLClient {

聽聽 public static void main(String[] args) throws Exception {

聽聽聽聽聽 File input = new File(鈥渢est.xml鈥?;

聽聽聽聽聽 PostMethod post = new PostMethod(鈥渉ttp://localhost:8080/httpclient/xml.jsp鈥?;

聽聽聽聽聽 // 璁剧疆璇锋眰鐨勫唴瀹圭洿鎺ヤ粠鏂囦欢涓鍙? 聽聽聽聽聽 post.setRequestBody( new FileInputStream(input));

聽聽聽聽聽 if (input.length() < Integer.MAX_VALUE)

聽聽聽聽聽聽聽聽 post.setRequestContentLength(input.length());

聽聽聽聽聽 else

聽聽聽聽聽聽聽聽 post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);

聽聽聽聽聽 // 鎸囧畾璇锋眰鍐呭鐨勭被鍨? 聽聽聽聽聽 post.setRequestHeader( "Content-type" , "text/xml; charset=GBK" );

聽聽聽聽聽 HttpClient httpclient = new HttpClient();

聽聽聽聽聽 int result = httpclient.executeMethod(post);

聽聽聽聽聽 System.out.println( "Response status code: " + result);

聽聽聽聽聽 System.out.println( "Response body: " );

聽聽聽聽聽 System.out.println(post.getResponseBodyAsString());

聽聽聽聽聽 post.releaseConnection();

聽聽 }

}

6锛?閫氳繃HTTP涓婁紶鏂囦欢

httpclient浣跨敤浜嗗崟鐙殑涓€涓狧ttpMethod瀛愮被鏉ュ鐞嗘枃浠剁殑涓婁紶锛岃繖涓被灏辨槸MultipartPostMethod锛岃绫诲凡缁忓皝瑁呬簡鏂囦欢涓婁紶鐨勭粏鑺傦紝鎴戜滑瑕佸仛鐨勪粎浠呮槸鍛婅瘔瀹冩垜浠涓婁紶鏂囦欢鐨勫叏璺緞鍗冲彲锛屼笅闈㈢殑浠g爜鐗囨婕旂ず濡備綍浣跨敤杩欎釜绫汇€?

MultipartPostMethod filePost = new MultipartPostMethod(targetURL);

filePost.addParameter( "fileName" , targetFilePath);

HttpClient client = new HttpClient();

// 鐢变簬瑕佷笂浼犵殑鏂囦欢鍙兘姣旇緝澶?, 鍥犳鍦ㄦ璁剧疆鏈€澶х殑杩炴帴瓒呮椂鏃堕棿

client.getHttpConnectionManager(). getParams().setConnectionTimeout(5000);

int status = client.executeMethod(filePost);

涓婇潰浠g爜涓紝targetFilePath鍗充负瑕佷笂浼犵殑鏂囦欢鎵€鍦ㄧ殑璺緞銆?

7锛?璁块棶鍚敤璁よ瘉鐨勯〉闈?

鎴戜滑缁忓父浼氱鍒拌繖鏍风殑椤甸潰锛屽綋璁块棶瀹冪殑鏃跺€欎細寮瑰嚭涓€涓祻瑙堝櫒鐨勫璇濇瑕佹眰杈撳叆鐢ㄦ埛鍚嶅拰瀵嗙爜鍚庢柟鍙紝杩欑鐢ㄦ埛璁よ瘉鐨勬柟寮忎笉鍚屼簬鎴戜滑鍦ㄥ墠闈粙缁嶇殑鍩轰簬琛ㄥ崟鐨勭敤鎴疯韩浠介獙璇併€傝繖鏄疕TTP鐨勮璇佺瓥鐣ワ紝httpclient鏀寔涓夌璁よ瘉鏂瑰紡鍖呮嫭锛氬熀鏈€佹憳瑕佷互鍙奛TLM璁よ瘉銆傚叾涓熀鏈璇佹渶绠€鍗曘€侀€氱敤浣嗕篃鏈€涓嶅畨鍏紱鎽樿璁よ瘉鏄湪HTTP1.1涓姞鍏ョ殑璁よ瘉鏂瑰紡锛岃€孨TLM鍒欐槸寰蒋鍏徃瀹氫箟鐨勮€屼笉鏄€氱敤鐨勮鑼冿紝鏈€鏂扮増鏈殑NTLM鏄瘮鎽樿璁よ瘉杩樿瀹夊叏鐨勪竴绉嶆柟寮忋€?

涓嬮潰渚嬪瓙鏄粠httpclient鐨凜VS鏈嶅姟鍣ㄤ腑涓嬭浇鐨勶紝瀹冪畝鍗曟紨绀哄浣曡闂竴涓璇佷繚鎶ょ殑椤甸潰锛?

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.UsernamePasswordCredentials;

import org.apache.commons.httpclient.methods.GetMethod;

public class BasicAuthenticationExample {

聽聽 public BasicAuthenticationExample() {

聽聽 }

聽聽 public static void main(String[] args) throws Exception {

聽聽聽聽聽 HttpClient client = new HttpClient();

聽聽聽聽聽 client.getState().setCredentials( "www.verisign.com" , "realm" , new UsernamePasswordCredentials( "username" , "password" ) );

聽聽聽聽聽 GetMethod get = new GetMethod( "https://www.verisign.com/products/index.html" );

聽聽聽聽聽 get.setDoAuthentication( true );

聽聽聽聽聽 int status = client.executeMethod( get );

聽聽聽聽聽 System.out.println(status+ "\n" + get.getResponseBodyAsString());

聽聽聽聽聽 get.releaseConnection();

聽聽 }

}

8锛?澶氱嚎绋嬫ā寮忎笅浣跨敤httpclient

澶氱嚎绋嬪悓鏃惰闂甴ttpclient锛屼緥濡傚悓鏃朵粠涓€涓珯鐐逛笂涓嬭浇澶氫釜鏂囦欢銆傚浜庡悓涓€涓狧ttpConnection鍚屼竴涓椂闂村彧鑳芥湁涓€涓嚎绋嬭闂紝涓轰簡淇濊瘉澶氱嚎绋嬪伐浣滅幆澧冧笅涓嶄骇鐢熷啿绐侊紝httpclient浣跨敤浜嗕竴涓绾跨▼杩炴帴绠$悊鍣ㄧ殑绫伙細MultiThreadedHttpConnectionManager锛岃浣跨敤杩欎釜绫诲緢绠€鍗曪紝鍙渶瑕佸湪鏋勯€燞ttpClient瀹炰緥鐨勬椂鍊欎紶鍏ュ嵆鍙紝浠g爜濡備笅锛?

MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();

HttpClient client = new HttpClient(connectionManager);

浠ュ悗灏界璁块棶client瀹炰緥鍗冲彲銆?

鍙傝€冭祫鏂欙細

httpclient棣栭〉锛毬犅犅?http://jakarta.apache.org/commons/httpclient/

鍏充簬NTLM鏄浣曞伐浣滐細聽 http://davenport.sourceforge.net/ntlm.html

锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞

HttpClient鍏ラ棬

http://blog.csdn.net/ambitiontan/archive/2006/01/07/572644.aspx

Jakarta Commons HttpClient 瀛︿範绗旇

http://blog.csdn.net/cxl34/archive/2005/01/19/259051.aspx

Cookies,SSL锛宧ttpclient鐨勫绾跨▼澶勭悊锛孒TTP鏂规硶

http://blog.csdn.net/bjbs_270/archive/2004/11/05/168233.aspx