您的位置:首页 > 理论基础 > 计算机网络

Android之网络编程(三)使用 HttpClient

2016-01-28 15:08 555 查看

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

的方式再实现一遍吧。


[title2]二,实例[/title2]

由于布局部分完全不用改动,所以现在直接修改 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();
}
……
}

这里我们并没有做太多的改动, 只是添加了一个 sendRequestWithHttpClient()方法, 并在

Send Request 按钮的点击事件里去调用这个方法。在这个方法中同样还是先开启了一个子线

程, 然后在子线程里使用 HttpClient 发出一条 HTTP 请求, 请求的目标地址还是百度的首页,

HttpClient 的用法也正如前面所介绍的一样。然后为了能让结果在界面上显示出来,这里仍

然是将服务器返回的数据存放到了 Message 对象中,并用 Handler 将 Message 发送出去。

仅仅只是改了这么多代码,现在我们可以重新运行一下程序了。点击 Send Request 按钮

后,你会看到和上一小节中同样的运行结果,由此证明,使用 HttpClient 来发送 HTTP 请求

的功能也已经成功实现了。

这样的话,相信你就已经把 HttpURLConnection 和 HttpClient 的基本用法都掌握得差不

多了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: