HttpClient初探
HttpClient是apach开源框架中的一个重要产品,封装了很多http操作(抱歉,用词不太专业),对于开发基于Http协议的应用,特别是基于http的c/s结构的应用提供了很多方便。具体内容bala-bala,可以登录http://hc.apache.org/去看和下载自己需要的东西。下面是我根据http://hc.apache.org/的提示利用HttpClient库运行起来的第一个Demo程序。一系列准备工作我觉的有必要说明下,特别是对第一次使用HtttpClient,又对英文比较头疼的菜鸟们(我也是其中一员)。
1.在官网下载HttpClient包,现在最新的是4.4的,但是由于是alpha版本,不够稳定,我们还是下载4.3GA(general available)版本的。解压后lib文件夹下就是我们要用的Jar包了。利用HttpClient开发程序时最好把这几个jar包都到到进入,省的出现class not found异常。这里强调下,官网还提供了一个AsyncHttpClient,故名思议,异步HttpClient。区别是:HttpClient使用的java 阻塞io模式,优点是低延迟,数据吞吐量大,但是由于每个客户连接都要建立一个线程,资源消耗比较大;AsyncHttpClient基于java nio(异步io,非阻塞io),可以更高效率的利用服务端资源和处理客户端Http连接,缺点是数据吞吐量没有HttpClient大,而且延迟会高一些。(任何一门编程技术其实都是有利弊的,获得一些优势就要牺牲一些的别的方面)
2.从官网下载HttpClient的源文件和HttpCore的源文件,在eclipse中绑定源文件,就可以直接在开发的时候查看javadoc和源文件了,不用再去查看在线帮助文档了。
3.有英语阅读条件的,最好从官网下个HttpClient的教程来看下,内容肯定很详细啦。我在附件中也上传了教程。
4.之前下载的HttpClient4.3库中还包含一些Demo,这对我们快速上手HttpClient开发很有用。下面是我运行的第一个Demo:
public class Test {
public static void main(String[] args) throws Exception {
//CloseableHttpClient是对HttpClient接口的实现,HttpClient是一个接口,是对http请求的抽象
//这里用HttpClients工厂类得到一个默认配置的CloseableHttpClient,使用完后记得要将httpclient
//close掉。
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
//这里连接的是百度的首页,执行Get请求
HttpGet httpGet = new HttpGet("http://www.baidu.com");
//CloseableHttpResponse是对HttpResponse和Closeable接口的继承
//用完同样记得要关掉,否则CloseableHttpResponse底层将一直保持该Http连接。
try {
System.out.println(response1.getStatusLine());
//这个entity是Http响应中的消息体,一般就是网页的文本内容
HttpEntity entity1 = response1.getEntity();
// do something useful with the response body
// and ensure it is fully consumed
//确保完整的读取到消息体并关闭消息体的流。
EntityUtils.consume(entity1);
} finally {
response1.close();
}
//这里连接的是百度的首页,执行Post请求
HttpPost httpPost = new HttpPost("http://www.baidu.com");
//添加Post请求的参数(位于消息体中)
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("username", "vip"));
nvps.add(new BasicNameValuePair("password", "secret"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
//执行Post提交
CloseableHttpResponse response2 = httpclient.execute(httpPost);
try {
System.out.println(response2.getStatusLine());
HttpEntity entity2 = response2.getEntity();
EntityUtils.consume(entity2);
} finally {
response2.close();
}
} finally {
httpclient.close();
}
}
}
5.执行代码,得到输出:
HTTP/1.1 200 OK
HTTP/1.1 302 Moved Temporarily
6.这是在wireshark中抓的包:
Get请求的内容:
Get请求返回的结果:
这是消息体部分:
Post的请求:
Post响应:
本人比较菜,不知到为什么Post请求给出发生302错误,我把post的name-value参数去掉仍然有这个错误,如果有大神知道请赐教。
相关推荐
创建一个 HttpClient 实例,这个实例需要调用 Dispose 方法释放资源,这里使用了 using 语句。接着调用 GetAsync,给它传递要调用的方法的地址,向服务器发送 Get 请求。