问题:
你需要通过HTTP GET方法来获取信息。
解答:
创建一个HttpClient实例,并调用以GetMethod对象为参数的executeMethod方法。然后,响应的内容就可以通过一个InputStream,byte[],或者是String来获得。下面的例子将获得
http://www.discursive.com /jccook/的内容,并且以一个String来获得响应。
1 import org.apache.commons.httpclient.HttpClient;
2 import org.apache.commons.httpclient.HttpException;
3 import org.apache.commons.httpclient.HttpMethod;
4 import org.apache.commons.httpclient.methods.GetMethod;
5
6 HttpClient client = new HttpClient( );
7 String url = "http://www.discursive.com/jccook/";
8 HttpMethod method = new GetMethod( url );
9
10 try {
11 client.executeMethod( method );
12
13 if( method.getStatusCode( ) == HttpStatus.SC_OK ) {
14 String response = method.getResponseBodyAsString( );
15 System.out.println( response );
16 }
17 } catch( HttpException he ) {
18 System.out.println( "HTTP Problem: " + he.getMessage( ) );
19 } catch( IOException ioe ) {
20 System.out.println( "IO Exeception: " + ioe.getMessage( ) );
21 } finally {
22 method.releaseConnection( );
23 method.recycle( );
24 }
这段代码用HTTP GET方法获得了
http://www.discursive.com/jccook/的内容。如果响应的状态码是HttpStatus.SC_OK(即200),下列响应将被输出到控制台:
<html>
<head>
<title>JCCook Example</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
讨论:
注意这段代码中对异常的处理。执行一个简单的HTTP GET需要捕捉两个异常:HttpException和IOException。如果是发生HTTP协议错误时,将抛出HttpException异常;如果是发生有关网络的错误时,将抛出IOException异常。这一章后面的例子将会忽略对异常的处理。你应该要知道每一次调用executeMethod()都要用适当的try/catch块包裹。
GetMethod类是HttpMethod接口的一种实现。HttpMethod会被HttpClient所调用。HttpMethod实现类的生命周期是很简单的:一个HttpMethod实例被创建,然后被HttpClient调用;一旦响应被检测到以后,HttpMethod释放连接并被回收使用。当HttpMethod调用了recycle()方法,相当于发送了一个信号给系统表示这个HttpMethod实例可以再被使用。releaseConnection()方法指示HttpClient释放掉与这个HttpMethod相关联的连接。无论在使用HttpMethod实例的过程中发生了什么,都要调用releaseConnection()来释放网络资源。
一旦HttpClient的executeMethod方法被调用,你可以通过HttpMethod的getStatusCode()方法来获得响应的状态码。这个方法返回一个int,对应于HttpStatus类的public static final 变量。HttpStatus类还包括下面一些常量:SC_OK(200),SC_NOT_FOUND(404),SC_INTERNAL_SERVER_ERROR(500),SC_MOVED_TEMPORARILY (302),SC_UNAUTHORIZED(401)等等。请参照HttpStatus的Javadoc来获得所有的HTTP状态列表。当服务器返回一个错误的HTTP状态是,通常还会返回一小段信息。这一小段信息可以通过HttpMethod类的getStatusText()方法获得。
参考:
可以从RFC2616(http://www.zvon.org/tmRFC/RFC2616/Output/index.html)获得HTTP GET方法的官方定义;
要获得HTTP 状态码的完整列表,请参见 HttpStatus Javadoc (http://jakarta.apache.org/commons/ httpclient/apidocs/index.html)。