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¶m2=value2"
,
null
);
3.
HttpUriRequest request =
new
HttpGet(uri);
4.
System.out.println(request.getURI());
上例的列印結果如下:
http://localhost/index.html?param1=value1¶m2=value2
(3)
需要注意的是,如果引數中含有中文,需將引數進行URLEncoding處理,如:
1.
String param =
"param1="
+
URLEncoder.encode(
"中國"
,
"UTF-8"
)
+
"¶m2=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=中國¶m2=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=中國¶m2=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=中國¶m2=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.
//
呼叫方式 略