HttpClient 基本类库使用
HttpClinet 提供了几个类来支持 HTTP 访问。下面我们通过一些示例代码来熟悉和说明这些类的功能和使用。 HttpClient 提供的 HTTP 的访问主要是通过 GetMethod 类和 PostMethod 类来实现的,他们分别对应了 HTTP Get 请求与 Http Post 请求。
GetMethod
使用 GetMethod 来访问一个 URL 对应的网页,需要如下一些步骤。
- 生成一个 HttpClinet 对象并设置相应的参数。
- 生成一个 GetMethod 对象并设置响应的参数。
- 用 HttpClinet 生成的对象来执行 GetMethod 生成的 Get 方法。
- 处理响应状态码。
- 若响应正常,处理 HTTP 响应内容。
- 释放连接。
清单 1 的代码展示了这些步骤,其中的注释对代码进行了较详细的说明。
清单 1.
/* 1 生成 HttpClinet 对象并设置参数*/ HttpClient httpClient=new HttpClient(); //设置 Http 连接超时为5秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); /*2 生成 GetMethod 对象并设置参数*/ GetMethod getMethod=new GetMethod(url); //设置 get 请求超时为 5 秒 getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,5000); //设置请求重试处理,用的是默认的重试处理:请求三次 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); /*3 执行 HTTP GET 请求*/ try{ int statusCode = httpClient.executeMethod(getMethod); /*4 判断访问的状态码*/ if (statusCode != HttpStatus.SC_OK) { System.err.println("Method failed: "+ getMethod.getStatusLine()); } /*5 处理 HTTP 响应内容*/ //HTTP响应头部信息,这里简单打印 Header[] headers=getMethod.getResponseHeaders(); for(Header h: headers) System.out.println(h.getName()+" "+h.getValue());*/ //读取 HTTP 响应内容,这里简单打印网页内容 byte[] responseBody = getMethod.getResponseBody();//读取为字节数组 System.out.println(new String(responseBody)); //读取为 InputStream,在网页内容数据量大时候推荐使用 InputStream response = getMethod.getResponseBodyAsStream();// … } catch (HttpException e) { // 发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println("Please check your provided http address!"); e.printStackTrace(); } catch (IOException e) { // 发生网络异常 e.printStackTrace(); } finally { /*6 .释放连接*/ getMethod.releaseConnection(); } |
这里值得注意的几个地方是:
- 设置连接超时和请求超时,这两个超时的意义不同,需要分别设置。
- 响应状态码的处理。
- 返回的结果可以为字节数组,也可以为 InputStream,而后者在网页内容数据量较大的时候推荐使用。
在处理返回结果的时候可以根据自己的需要,进行相应的处理。如笔者是需要保存网页
到本地,因此就可以写一个 saveToLocaleFile(byte[] data, String filePath) 的方法,将字节数组保存成本地文件。后续的简易爬虫部分会有相应的介绍。
转载来源:http://tgyd2006.iteye.com/category/27104?show_full=true