Android之网络编程(三)使用 HttpClient
一,简介
HttpClient是 Apache提供的 HTTP网络访问接口, 从一开始的时候就被引入到了 Android
API 中。它可以完成和 HttpURLConnection 几乎一模一样的效果,但两者之间的用法却有较
大的差别,那么我们自然要看一下 HttpClient 是如何使用的了。
首先你需要知道,HttpClient 是一个接口,因此无法创建它的实例,通常情况下都会创
建一个 DefaultHttpClient 的实例,如下所示:
HttpClient httpClient = new DefaultHttpClient();
接下来如果想要发起一条 GET 请求,就可以创建一个 HttpGet 对象,并传入目标的网络
地址,然后调用 HttpClient 的 execute()方法即可:
HttpGet httpGet = new HttpGet("http://www.baidu.com");
httpClient.execute(httpGet);
如果是发起一条 POST 请求会比 GET 稍微复杂一点,我们需要创建一个 HttpPost 对象,
并传入目标的网络地址,如下所示:
HttpPost httpPost = new HttpPost("http://www.baidu.com");
然后通过一个 NameValuePair 集合来存放待提交的参数,并将这个参数集合传入到一个
UrlEncodedFormEntity中,然后调用 HttpPost的 setEntity()方法将构建好的 UrlEncodedFormEntity
传入,如下所示:
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", "admin"));
params.add(new BasicNameValuePair("password", "123456"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");
httpPost.setEntity(entity);
接下来的操作就和 HttpGet 一样了,调用 HttpClient 的 execute()方法,并将 HttpPost 对
象传入即可:
httpClient.execute(httpPost);
执行 execute()方法之后会返回一个 HttpResponse对象, 服务器所返回的所有信息就会包
含在这里面。通常情况下我们都会先取出服务器返回的状态码,如果等于 200就说明请求和
响应都成功了,如下所示:
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应都成功了
}
接下来在这个 if 判断的内部取出服务返回的具体内容,可以调用 getEntity()方法获取到
一个 HttpEntity 实例, 然后再用 EntityUtils.toString()这个静态方法将 HttpEntity 转换成字符串
即可,如下所示:
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity);
注意如果服务器返回的数据是带有中文的,直接调用 EntityUtils.toString()方法进行转换
会有乱码的情况出现,这个时候只需要在转换的时候将字符集指定成 utf-8 就可以了,如下
所示:
String response = EntityUtils.toString(entity, "utf-8");
好了,基本的用法就是如此,接下来就让我们把 NetworkTest 这个项目改用 HttpClient
的方式再实现一遍吧。
二,实例
由于布局部分完全不用改动,所以现在直接修改 MainActivity 中的代码,如下所示:public class MainActivity extends Activity implements OnClickListener {
……
@Override
public void onClick(View v) {
if (v.getId() == R.id.send_request) {
sendRequestWithHttpClient();
}
}
private void sendRequestWithHttpClient() {
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://www.baidu.com");
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应都成功了
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity,
"utf-8");
Message message = new Message();
message.what = SHOW_RESPONSE;
// 将服务器返回的结果存放到Message 中
message.obj = response.toString();
handler.sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
……
}