HttpClient4 用法 由HttpClient3 升级到 HttpClient4 必看(二)

2015-07-16 12:55:51 · 作者: · 浏览: 48
方式是在request-body中提供参数,此方式只能用于POST请求。在 HttpClient程序包中有两个类可以完成此项工作,它们分别是UrlEncodedFormEntity类与MultipartEntity类。这两个类均实现了HttpEntity接口。


(1)


使用最多的是UrlEncodedFormEntity类。通过该类创建的对象可以模拟传统的HTML表单传送POST请求中的参数。如下面的表单:



? ?


? ?


? ?



我们可以用下面的代码实现:


List formParams = new ArrayList();


formParams.add(new BasicNameva luePair("param1", "中国"));


formParams.add(new BasicNameva luePair("param2", "value2"));


HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");


HttpPost request = new HttpPost(“http://localhost/index.html”);


request.setEntity(entity);


当然,如果想查看HTTP数据格式,可以通过HttpEntity对象的各种方法取得。如:


List formParams = new ArrayList();


formParams.add(new BasicNameva luePair("param1", "中国"));


formParams.add(new BasicNameva luePair("param2", "value2"));


UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");


System.out.println(entity.getContentType());


System.out.println(entity.getContentLength());


System.out.println(EntityUtils.getContentCharSet(entity));


System.out.println(EntityUtils.toString(entity));


上例的打印结果如下:


? ? Content-Type: application/x-www-form-urlencoded; charset=UTF-8


? ? 39


? ? UTF-8


? ? param1=%E4%B8%AD%E5%9B%BD¶m2=value2


(2)


除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为 multipart/form-data。在HttpClient程序扩展包(HttpMime)中专门有一个类与之对应,那就是 MultipartEntity类。此类同样实现了HttpEntity接口。如下面的表单:



? ? ? ? enctype="multipart/form-data">


? ?


? ?


? ?


? ?



我们可以用下面的代码实现:


MultipartEntity entity = new MultipartEntity();


entity.addPart("param1", new StringBody("中国", Charset.forName("UTF-8")));


entity.addPart("param2", new StringBody("value2", Charset.forName("UTF-8")));


entity.addPart("param3", new FileBody(new File("C:\\1.txt")));


HttpPost request = new HttpPost(“http://localhost/index.html”);


request.setEntity(entity);


HTTP响应


HttpClient程序包对于HTTP响应的处理较之HTTP请求来说是简单多了,其过程同样使用了HttpEntity接口。我们可以从 HttpEntity对象中取出数据流(InputStream),该数据流就是服务器返回的响应数据。需要注意的是,HttpClient程序包不负责解析数据流中的内容。如:


HttpUriRequest request = ...;


HttpResponse response = httpClient.execute(request);


// 从response中取出HttpEntity对象


HttpEntity entity = response.getEntity();


// 查看entity的各种指标


System.out.println(entity.getContentType());


System.out.println(entity.getContentLength());


System.out.println(EntityUtils.getContentCharSet(entity));


// 取出服务器返回的数据流


InputStream stream = entity.getContent();


// 以任意方式操作数据流stream


// 调用方式 略


附注:


本文说明的是HttpClient 4.0.1,该程序包(包括依赖的程序包)由以下几个JAR包组成:


commons-logging-1.1.1.jar


commons-codec-1.4.jar


httpcore-4.0.1.jar


httpclient-4.0.1.jar


apache-mime4j-0.6.jar


httpmime-4.0.1.jar


可以在此处下载完整的JAR包。


现在Apache已经发布了:HttpCore 4.0-beta3、HttpClient 4.0-beta1。


到此处可以去下载这些源代码:http://hc.apache.org/downloads.cgi


另外,还需要apache-mime4j-0.5.jar 包。


在这里先写个简单的POST方法,中文资料不多,英文不太好。


package test;


import java.util.ArrayList;


import java.util.List;


import org.apache.http.Header;


import org.apache.http.HttpEntity;


import org.apache.http.HttpResponse;


import org.apache.http.Nameva luePair;


import org.apache.http.client.entity.UrlEncodedFormEntity;


import org.apache.http.client.methods.HttpPost;


import org.apache.http.client.params.CookiePolicy;


import org.apache.http.client.params.ClientPNames;


import org.apache.http.impl.client.DefaultHttpClient;


import org.apache.http.message