1. 程式人生 > >httpclient 4 使用 幾點用法(模擬表單)

httpclient 4 使用 幾點用法(模擬表單)

HTTP請求

HTTP 1.1由以下幾種請求組成:GET, HEAD, POST, PUT, DELETE, TRACE and OPTIONS, 程式包中分別用HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions 這幾個類建立請求。所有的這些類均實現了HttpUriRequest介面,故可以作為execute的執行引數使用。
所有請求中最常用的是GET與POST兩種請求,與建立GET請求的方法相同,可以用如下方法建立一個POST請求:

1.HttpUriRequest request =
 new HttpPost(

HTTP請求格式告訴我們,有兩個位置或者說兩種方式可以為request提供引數:request-line方式與request-body方式。

request-line

request-line方式是指在請求行上通過URI直接提供引數。
(1)
我們可以在生成request物件時提供帶引數的URI,如:

(2)
另外,HttpClient程式包為我們提供了URIUtils工具類,可以通過它生成帶引數的URI,如:

1.URI uri = URIUtils.createURI("http", "localhost", -1, "/index.html"
,
2."param1=value1&param2=value2", null); 3.HttpUriRequest request = new HttpGet(uri); 4.System.out.println(request.getURI());

上例的列印結果如下:

http://localhost/index.html?param1=value1&param2=value2

(3)
需要注意的是,如果引數中含有中文,需將引數進行URLEncoding處理,如:

1.String param = "param1=" + URLEncoder.encode(
"中國", "UTF-8") + "&param2=value2";
2.URI uri = URIUtils.createURI("http", "localhost", 8080, 3."/sshsky/index.html", param, null); 4.System.out.println(uri);

上例的列印結果如下:

http://localhost/index.html?param1=中國&param2=value2

(4)
對於引數的URLEncoding處理,HttpClient程式包為我們準備了另一個工具類:URLEncodedUtils。通過它,我們可以直觀的(但是比較複雜)生成URI,如:

1.List<NAMEVALUEPAIR> params = new ArrayList<NAMEVALUEPAIR>(); 2.params.add(new BasicNameValuePair("param1", "中國")); 3.params.add(new BasicNameValuePair("param2", "value2")); 4.String param = URLEncodedUtils.format(params, "UTF-8"); 5.URI uri = URIUtils.createURI("http", "localhost", 8080, 6."/sshsky/index.html", param, null); 7.System.out.println(uri);

上例的列印結果如下:

http://localhost/index.html?param1=中國&param2=value2

request-body

與request-line方式不同,request-body方式是在request-body中提供引數,此方式只能用於POST請求。在HttpClient程式包中有兩個類可以完成此項工作,它們分別是UrlEncodedFormEntity類與MultipartEntity類。這兩個類均實現了HttpEntity介面。
(1)
使用最多的是UrlEncodedFormEntity類。通過該類建立的物件可以模擬傳統的HTML表單傳送POST請求中的引數。如下面的表單:

2.<input type="text" name="param1" value="中國"/> 3.<input type="text" name="param2" value="value2"/> 4.<inupt type="submit" value="submit"/> 5.</form>

我們可以用下面的程式碼實現:

1.List<NAMEVALUEPAIR> formParams = new ArrayList<NAMEVALUEPAIR>(); 2.formParams.add(new BasicNameValuePair("param1", "中國")); 3.formParams.add(new BasicNameValuePair("param2", "value2")); 4.HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8"); 5. 6.HttpPost request = new HttpPost(“http://localhost/index.html”); 7.request.setEntity(entity);

當然,如果想檢視HTTP資料格式,可以通過HttpEntity物件的各種方法取得。如:

01.List<NAMEVALUEPAIR> formParams = new ArrayList<NAMEVALUEPAIR>(); 02.formParams.add(new BasicNameValuePair("param1", "中國")); 03.formParams.add(new BasicNameValuePair("param2", "value2")); 04.UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8"); 05. 06.System.out.println(entity.getContentType()); 07.System.out.println(entity.getContentLength()); 08.System.out.println(EntityUtils.getContentCharSet(entity)); 09.System.out.println(EntityUtils.toString(entity));

上例的列印結果如下:

Content-Type: application/x-www-form-urlencoded; charset=UTF-8
39
UTF-8
param1=中國&param2=value2

(2)
除了傳統的application/x-www-form-urlencoded表單,我們另一個經常用到的是上傳檔案用的表單,這種表單的型別為multipart/form-data。在HttpClient程式擴充套件包(HttpMime)中專門有一個類與之對應,那就是MultipartEntity類。此類同樣實現了HttpEntity介面。如下面的表單:

2.enctype="multipart/form-data"> 3.<input type="text" name="param1" value="中國"/> 4.<input type="text" name="param2" value="value2"/> 5.<input type="file" name="param3"/> 6.<inupt type="submit" value="submit"/> 7.</form>

我們可以用下面的程式碼實現:

1.MultipartEntity entity = new MultipartEntity(); 2.entity.addPart("param1", new StringBody("中國", Charset.forName("UTF-8"))); 3.entity.addPart("param2", new StringBody("value2", Charset.forName("UTF-8"))); 4.entity.addPart("param3", new FileBody(new File("C:\\1.txt"))); 5. 6.HttpPost request = new HttpPost(“http://localhost/index.html”); 7.request.setEntity(entity);

HTTP響應

HttpClient程式包對於HTTP響應的處理較之HTTP請求來說是簡單多了,其過程同樣使用了HttpEntity介面。我們可以從HttpEntity物件中取出資料流(InputStream),該資料流就是伺服器返回的響應資料。需要注意的是,HttpClient程式包不負責解析資料流中的內容。如:

01.HttpUriRequest request = ...; 02.HttpResponse response = httpClient.execute(request); 03. 04.// 從response中取出HttpEntity物件 05.HttpEntity entity = response.getEntity(); 06. 07.// 檢視entity的各種指標 08.System.out.println(entity.getContentType()); 09.System.out.println(entity.getContentLength()); 10.System.out.println(EntityUtils.getContentCharSet(entity)); 11. 12.// 取出伺服器返回的資料流 13.InputStream stream = entity.getContent(); 14. 15.// 以任意方式操作資料流stream 16.// 呼叫方式 略