分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

HttpComponents入门解析

发布时间:2023-09-06 01:31责任编辑:沈小雨关键词:暂无标签
???????????????????????

1 简介

超文本传输协议(http)是目前互联网上极其普遍的传输协议,它为构建功能丰富,绚丽多彩的网页提供了强大的支持。构建一个网站,通常无需直接操作http协议,目前流行的WEB框架已经透明的将这些底层功能封装的很好了,如常见的J2EE, .NET, php等框架或语言。

除了作为网站系统的底层支撑,http同样可以在其它的一些场景中使用,如游戏服务器和客户端的传输协议、web service、 网络爬虫、HTTP代理、网站后台数据接口等。

Http Components 对HTTP底层协议进行了很好的封装,如果你是一个J2EE、.net或php程序员,对下面涉及的概念可能不会陌生。

2 httpComponents组件结构

HttpComponents Core

简称HttpCore, 是一组底层Http传输协议组件,支持两种I/O模型,阻塞I/O模型和和非阻塞I/O模型。上层组件(HttpComponents Client, HttpComponents AsyncClient)依赖此组件实现数据传输。

阻塞I/O模型基于基本的JAVA I/O实现,非阻塞模型基于JAVA NIO实现。

HttpComponents Client

建立在HttpCore之上的Http客户端管理组件。底层基于HttpCore 阻塞I/O。从Commons HttpClient 3.x 继承而来,Commons HttpClient原来是apache commons组建的一部分,现在被HttpComponents Client所替代了。

原始的Commons HttpClient 3.x可以在http://hc.apache.org/httpclient-legacy/index.html找到。

HttpComponents AsyncClient

建立在HttpCore NIO模型之上的Http客户端,与基于阻塞I/O的HttpComponents Client形成互补,由于底层使用的NIO非阻塞模型,所以适用于高性能的应用场景。

开始使用HttpComponents组件

首先打开http://hc.apache.org/,点击左侧的Download链接,进入下载页面,下载最新版本的HttpComponents。在编写本文时最新版本是4.1.2。解压缩下载到的压缩包,lib目录下是HttpComponents和它依赖的类库,将它们放到你的工程classpath中,如果依赖文件已经存在了,不要放置多份,以免类库之间的冲突。

然后需要检查一下工程的classpath中是否存在commons http包。Commons http与HttpComponents是完全两个东西,HttpComponents中的Client是从Commons http继承而来的,所以很多类名是相同的。为了避免出现莫名奇妙的问题,应将Commons http从工程中删除(当然,如果你认为自己足够聪明,也可以在引用java包时小心区分)。

Commons http类库的包是org.apache.commons.httpclient

HttpComonents类库的包是org.apache.http

3 Get请求

Get、Post是最常见的获取网页内容的请求形式,当然,返回内容并非必须是html代码,任何的xml、json或文字字符串都可以作为返回内容。

下面是用Get请求获取一个html网页内容的代码

Java代码
  1. //(1)创建HttpGet实例
  2. HttpGetget=newHttpGet("http://www.126.com");
  3. //(2)使用HttpClient发送get请求,获得返回结果HttpResponse
  4. HttpClienthttp=newDefaultHttpClient();
  5. HttpResponseresponse=http.execute(get);
  6. //(3)读取返回结果
  7. if(response.getStatusLine().getStatusCode()==200){
  8. HttpEntityentity=response.getEntity();
  9. InputStreamin=entity.getContent();
  10. readResponse(in);
  11. }

(1)HttpGet的实例就是一个get请求,构造函数只有一个字符串参数,即要获取的网页地址。另外一种构造形式是使用URI实例作为HttpGet的参数。HttpComponents提供了URIUtils类,它的createURI()返回一个URI实例,将请求地址拆分构造不失为一种更加清晰的方式。

URI uri = URIUtils.createURI("http", "www.126.com", 80, "/", "", null);
HttpGet get = new HttpGet(uri);

(2)请求最后被HttpClient发送出去,new DefaultHttpClient()创建一个基本的HttpClient实例。由于底层是基于阻塞的JAVA I/O模型,执行execute()的时间与具体请求的远程服务器和网络速度有关,在实际运行场景中应特别注意此问题。如果是在tomcat等环境中执行可能会造成线程等待,浪费服务器资源,或拒绝其它的连接。

(3)请求返回后就可以读取返回内容了,但有一个前提是此次请求是否真的成功了?服务器地址错误,或请求的页面不存在等问题都会让请求失败。为了确保得到了正确的响应首先应判断返回码是否正确。调用response.getStatusLine()返回一个StatusLine的实例,此实例描述了一次请求的响应信息。一个成功响应的StatusLine实例本身包含如下信息:

HTTP/1.0 200 OK

HTTP/1.0:是请求协议和版本号

200:是响应码

StatusLine的下面2个方法分别用于获取响应信息的各部分内容

getProtocolVersion(): 得到请求协议和协议版本号,如HTTP/1.0

getStatusCode():得到响应码,如200

HttpEntity entity = response.getEntity()返回一个HttpEntity实例,进而调用getContent()就得到了一个输入流。后面的事情应该很明确了。readResponse()是一个自己写的读取输入流中字符串的方法,代码如下:

Java代码
  1. publicstaticvoidreadResponse(InputStreamin)throwsException{
  2. BufferedReaderreader=newBufferedReader(newInputStreamReader(in));
  3. Stringline=null;
  4. while((line=reader.readLine())!=null){
  5. System.out.println(line);
  6. }
  7. }

4 Post请求

Post请求在代码上与Get请求的主要区别是将HttpGet换成了HttpPost,其余部分代码基本一致。请看代码:

Java代码
  1. //(1)创建HttpGet实例
  2. <spanstyle="color:#ff0000;">HttpPostpost=newHttpPost("http://www.126.com");</span>
  3. //(2)使用HttpClient发送get请求,获得返回结果HttpResponse
  4. HttpClienthttp=newDefaultHttpClient();
  5. HttpResponseresponse=http.execute(<spanstyle="color:#ff0000;">post</span>);
  6. //(3)读取返回结果
  7. if(response.getStatusLine().getStatusCode()==200){
  8. HttpEntityentity=response.getEntity();
  9. InputStreamin=entity.getContent();
  10. readResponse(in);
  11. }

与Get请求不同的代码被标注为红色。可见Post请求与Get请求在代码上的区别并不大,互相切换也是比较容易的。在下面可以看到的令一个不同之处是传递的查询字符串,即请求参数。

5 参数传递

Get与Post在传递参数时有一些区别,Get请求的参数作为查询字符串出传递,而Post请求的参数则作为实体传递。在开发WEB项目时经常遇到乱码的问题,使用HttpComponents也会涉及到这个问题,所以在使用时应特别注意。服务器端的处理方法与WEB项目相同, HttpComponents只要注意字符编码就可以了。

Get请求传递参数方法一:将查询字符串作为请求地址的一部分

这是一种最简单的传参方式,将查询参数用(&)连接,然后放在请求地址?的后面,如下面这个请求地址

http://localhost:8080/servlet1?name=ahopedog&work=programer

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved