概述

这一篇文章讲解如何使用 HttpClient 来请求 Web 数据。正如我们平时使用浏览器一样,我们在地址栏输入网址,而浏览器就会跳转呈现给我们网站的内容,那是因为,网站获取到这个网页的 html 源代码,然后通过调用内核进行 UI 显示,然后我们就可以看到整个网页的内容了,而不是 html 代码,而我们这里使用 HttpClient 请求 webpage 得到的是 html 源代码,而不是 UI 图像(这应该是得不到的,而是要自己处理的,所以各种浏览器之间的呈现效果略有不同)。

那么,正如我们在《计算机网络》课程中学习到的一样,虽然 Http 请求有 6 种方式,但是也就用到 4 种(还记得是什么吗?GET、POST、HEAD、PUT),而常用的也就两种(GET 和 POST),因此我这里也就接受这两种,也希望抛砖引玉,大家在使用到其他方法的时候能从这两种常用的方法中得到一个启示,从而可以轻松得上手,这也许是我学习的方式,不知道大家赞同不?

首先,那么先进行准备工作,jar 包是少不了的,这个网站很有用,希望大家能够多多阅览:http://apache.org/

HTTPClient 也是其中的一个子项目,所以大家可以从 apache 主页上找,也可以从这个地址上找

http://hc.apache.org/(左边导航栏有 HttpClient(GA))

下载下来以后,我们就创建一个”java 项目”,名字就取 HttpClient 好了,然后创建一个 Main 类,我们就从这里开始,当然,别忘记了导入 jar 包 GET 请求 先说明一下,使用 HttpClient 请求的方法不止一种,至少我知道的就不止一种了,这里我介绍的我认为比较容易被大家接受的一种。

步骤:

那么,下面就给出代码:

  1. import java.io.IOException;
  2. import org.apache.http.HttpEntity;
  3. import org.apache.http.HttpResponse;
  4. import org.apache.http.HttpStatus;
  5. import org.apache.http.HttpVersion;
  6. import org.apache.http.client.ClientProtocolException;
  7. import org.apache.http.client.HttpClient;
  8. import org.apache.http.client.methods.HttpGet;
  9. import org.apache.http.impl.client.DefaultHttpClient;
  10. import org.apache.http.message.BasicHttpResponse;
  11. import org.apache.http.protocol.HttpService;
  12. public class Main
  13. {
  14. public static void main(String[] args) throws ClientProtocolException, IOException
  15. {
  16. //使用HttpClient构建一个浏览器
  17. HttpClient client = new DefaultHttpClient();
  18. //使用URL构建一个请求方法实例,注意这里是GET方式
  19. String uri = http://www.baidu.com;
  20. HttpGet httpGet = new HttpGet(uri);
  21. //浏览器打开请求方法实例,并且获得Response
  22. HttpResponse response = client.execute(httpGet);
  23. //获取reponse内容,这里略复杂,主要是response中还包含请求头等信息
  24. HttpEntity entity;
  25. byte[] buffer = new byte[1024];
  26. int length;
  27. if((entity = response.getEntity()) != null)
  28. {
  29. BufferedInputStream bis = new BufferedInputStream(entity.getContent());
  30. while((length = bis.read(buffer)) != -1)
  31. {
  32. //直接打印得到的实体
  33. System.out.println(new String(buffer, 0, length));
  34. }
  35. }
  36. //关闭浏览器
  37. client.getConnectionManager().shutdown();
  38. }
  39. }

执行这段代码,将会得到以下结果

  1. <!doctype html><html><head>.....
  2. </html>

你可以将以上代码复制到记事本中,然后保存文件名为”baidu.html” 到桌面,然后使用浏览器打开,你会发现这就是百度的首页了。

POST 请求

post 请求其实和 get 请求一样,不过是构建的请求方法实例不同而已,POST 请求方法实例是 HttpPost,这个类能够把一个 URL
自动得处理,然后使用 POST 的方式提交,而我们只需要向构建 HttpGet 一样使用它就可以了,如下

  1. public static void main(String[] args) throws ClientProtocolException, IOException
  2. {
  3. //使用HttpClient构建一个浏览器
  4. HttpClient client = new DefaultHttpClient();
  5. //使用URL构建一个请求方法实例,注意这里是POST方式
  6. HttpPost post = new HttpPost(https://api.weibo.com/oauth2/access_token?client_ +
  7. id=730776687&amp;client_secret=00000000000000000000000000000000&amp;grant_type +
  8. =authorization_code&amp;redirect_uri=http://www.liuliqiang.cn&amp;code=7c65219 +
  9. 839dee8debd32cdaa81ffe816);
  10. //浏览器打开请求方法实例,并且获得Response
  11. HttpResponse response = client.execute(post);
  12. //获取reponse内容,这里略复杂,主要是response中还包含请求头等信息
  13. HttpEntity entity;
  14. byte[] buffer = new byte[1024];
  15. int length;
  16. if((entity = response.getEntity()) != null)
  17. {
  18. BufferedInputStream bis = new BufferedInputStream(entity.getContent());
  19. while((length = bis.read(buffer)) != -1)
  20. {
  21. //直接打印得到的实体
  22. System.out.println(new String(buffer, 0, length));
  23. }
  24. }
  25. //关闭浏览器
  26. client.getConnectionManager().shutdown();
  27. }

需要注意的是,最后的关闭浏览器步骤不要忘记了哦,正常情况下不会有什么问题,但是如果服务器设置不理想的话,不关闭会导致一些大问题。。

这个是微博接口的,得到的以下结果,
{access_token:2.00000000000000000000000,remind_in:179473,expires_in:179473,uid:2107671612`}

好,这个应该算是完结了,如果大家还有不理解,可以查看官方文档,或者访问官方网站,我已经下载了官方的说明文档,你可以点击这里下载

在新窗口打开下载
在新窗口访问官方