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 的基本用法都掌握得差不
多了。
相关文章推荐
- XMLHttpRequest2 异步 ajax
- Ajax comet XMLHttpRequest 异步
- 单元测试中模拟HttpContext.Current
- Android之网络编程(二)使用 HttpURLConnection
- Let’s encrypt 计划为网站提供免费的基本 SSL 证书,以加速互联网从 HTTP 向 HTTPS 过渡。
- Android之网络编程(一)WebView 的用法
- 网络数据包收发流程(四):协议栈之packet_type
- 进行网络出现问题Error Domain=kCFErrorDomainCFNetwork Code=-1022 "The resource could not be loaded because th
- 通信协议:HTTP、TCP、UDP
- 网络数据包收发流程(三):e1000网卡和DMA
- 云服务正在吞噬世界!
- 网络数据包收发流程(二):不配置NAPI的情况
- 网络数据包收发流程(一):从驱动到协议栈
- HttpContext.Current.Session 为null
- 关于Xcode7上传时出现error的解决办法(Http://)传输协议
- TCP的哪些事(上)
- Linux tcpdump的命令大全
- [计算机网络]TCP与UDP
- TCP的哪些事(下)
- Tcpdump的详细用法