JavaHTTPClient入门
- 格式:docx
- 大小:28.71 KB
- 文档页数:8
JavahttpClient介绍以及使⽤⽰例Java 开发语⾔中实现HTTP请求的⽅法主要有两种:⼀种是JAVA的标准类HttpUrlConnection,⽐较原⽣的实现⽅法;另⼀种是第三⽅开源框架HTTPClient。
HttpClient相⽐传统JDK⾃带的URLConnection,增加了易⽤性和灵活性,它不仅是客户端发送Http请求变得容易,⽽且也⽅便了开发⼈员测试接⼝(基于Http协议的),即提⾼了开发的效率,也⽅便提⾼代码的健壮性。
⼀、HttpClient简单介绍HttpClient是Apache Jakarta Common下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持HTTP协议的客户端编程⼯具包,并且它⽀持HTTP协议最新的版本和建议。
HttpClient已经应⽤在很多的项⽬中,⽐如Apache Jakarta上很著名的另外两个开源项⽬Cactus和HTMLUnit都使⽤了HttpClient。
HTTPClient对HTTP的封装性⽐较不错,通过它基本上能够满⾜我们⼤部分的需求。
HttpClient3.1 是mons.httpclient下操作远程 url的⼯具包,虽然已不再更新,但实现⼯作中使⽤httpClient3.1的代码还是很多。
HttpClient4.5 是org.apache.http.client下操作远程 url的⼯具包。
⼆、HttpClient特性基于标准、纯净的java语⾔。
实现了Http1.0和Http1.1。
以可扩展的⾯向对象的结构实现了Http全部的⽅法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
⽀持HTTPS协议。
通过Http代理建⽴透明的连接。
利⽤CONNECT⽅法通过Http代理建⽴隧道的https连接。
Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证⽅案。
【java】httpclient的使⽤之java代码内发送http请求场景:需要本项⽬发送HTTP请求到另⼀个项⽬中,处理完成返回值给本项⽬。
1.本项⽬引⼊架包<!-- httpclient 后台发送http请求--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>2.本项⽬⽰例代码如下:【本⽅法,带着本项⽬中的UUID去请求了本地的另⼀个项⽬,处理完成之后,获取返回值】public boolean validate(String uuid){CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build();HttpGet httpGet = new HttpGet("http://localhost:8080/jms/validate2.jhtml?uuid="+uuid);try {CloseableHttpResponse closeableHttpResponse = closeableHttpClient.execute(httpGet);HttpEntity entity = closeableHttpResponse.getEntity();String flag = EntityUtils.toString(entity);return "true".equals(flag);} catch (IOException e) {e.printStackTrace();}return false;}3.另⼀个项⽬的⽰例代码:【另⼀个项⽬中的这个⽅法,就是判断本地的⼀个Vector中是否存在本uuid,如果存在返回true】@RequestMapping("validate2")@ResponseBodypublic boolean validate2(String uuid){if(vector.contains(uuid)){vector.remove(uuid);return true;}else{return false;}}。
一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。
所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。
目前我们使用的浏览器处理这些情况都不会构成问题。
不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。
如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。
但是考虑到一些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到COOKIE问题的处理。
我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。
为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”!再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了!我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。
当然了,正如前面说到的,如果我们自己使用.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的commons项目,目前的版本是2.0RC2。
java使用httpclient发送postgetputdelete请求1.发送POST请求:使用HttpClient发送POST请求非常简单。
需要创建一个HttpClient对象,然后通过HttpPost对象来设置请求的URL和请求体。
接下来,将HttpPost对象传递给HttpClient的execute方法,以执行POST请求。
最后,从HttpResponse对象中获取响应体。
以下是一个示例代码,演示了如何使用HttpClient发送POST请求:```public class HttpClientExamplepublic static void main(String[] args)try// 创建HttpClient对象// 创建HttpPost对象,并设置URL//设置请求体String requestBody = "data=test";StringEntity entity = new StringEntity(requestBody);//执行POST请求//从响应中获取响应体HttpEntity responseEntity = response.getEntity(;String responseBody = EntityUtils.toString(responseEntity);System.out.println(responseBody);} catch (Exception e)e.printStackTrace(;}}```2.发送GET请求:发送GET请求与发送POST请求的过程类似。
只需创建一个HttpGet 对象,并设置请求的URL。
接下来,将HttpGet对象传递给HttpClient 的execute方法,以执行GET请求。
再从HttpResponse对象中获取响应体。
以下是一个示例代码,演示了如何使用HttpClient发送GET请求:```public class HttpClientExamplepublic static void main(String[] args)try// 创建HttpClient对象// 创建HttpGet对象,并设置URL//执行GET请求//从响应中获取响应体String responseBody =EntityUtils.toString(response.getEntity();System.out.println(responseBody);} catch (Exception e)e.printStackTrace(;}}```3.发送PUT请求:发送PUT请求与发送POST请求的方法类似。
李腾飞学习笔记 HttpClient入门版本 1.0修订历史记录日期 版本 说明 作者 8/12/2010 1.0创建 李腾飞目录1.HttpClient概述 42.了解JDK中有关HTTP URL处理的API 42.1最简单的获取网页内容的示例 42.2URLConnection的基本用法 42.3HttpURLConnection的用法 43.使用HttpClient获取网页内容 63.1使用GET方式向后台递交请求 63.2自动获得响应的编码信息 73.3设置代理服务器,访问网站 73.4获得重定向之后的网址信息 93.5自动Cookie处理 10HttpClient入门1.HttpClient概述HttpClient是apache组织下面的一个用于处理HTTP请求和响应的开源工具。
它不是一个浏览器,也不处理客户端缓存等浏览器的功能。
它只是一个类库!它在JDK的基本类库基础上做了更好的封装! HttpClient目前(写作本文日期:2010年8月)最新版本是4.0.1,官方网址:/httpcomponents-client-4.0.1/index.htmlHttpClient项目依赖于HttpCore(处理核心的HTTP协议)、commons-codec(处理与编码有关的问题的项目)和commons-logging(处理与日志记录有关问题的项目)。
如果你希望能够通过HttpClient向服务器上传文件等与multipart编码类型有关的请求,以及其它复杂的MIME类型,那么,你需要另外一个依赖包:HttpMime(它是专门处理与MIME类型有关问题的项目),在下载的HttpClient包中(下载地址为:/downloads.cgi)已经包含了HttpMime。
在本文中,我们使用的HttpClient版本为:4.0.1GA开始使用HttpClient,我们加入了下列依赖包:httpclient-4.0.1.jarhttpcore-4.0.1.jarhttpmime-4.0.1.jar- 又依赖于mime4j(apache-mime4j-0.6.jar)commons-codec-1.4.jarcommons-logging-1.1.1.jarcommons-io-1.4.jar – 为了更方便处理与IO有关的需求【如果你下载的是包含依赖包的压缩包,那么上述依赖包(除commons-io-1.4.jar外)都已经在其中了!】2.了解JDK中有关HTTP URL处理的API因为HttpClient是对JDK中.*包下面的有关基础类库的封装,所以,我们有必要了解一下,这些基础类库的简单用法和概念。
Java#HttpClien详解⽬录:(1)HttpClient简介(2)HttpClient功能介绍(3)HttpClient基本功能的使⽤(4)HttpClient使⽤过程中常见问题(5)HttpClient⽇志配置(6)HttpClient处理关闭问题(7)处理代理服务器1.HttpClient简介HttpClient 是 Apache Jakarta Common 下的⼦项⽬,可以⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持 HTTP 协议最新的版本和建议。
本⽂⾸先介绍 HTTPClient,然后根据作者实际⼯作经验给出了⼀些常见问题的解决⽅法。
HTTP 协议可能是现在 Internet 上使⽤得最多、最重要的协议了,越来越多的 Java 应⽤程序需要直接通过 HTTP 协议来访问⽹络资源。
虽然在 JDK 的 包中已经提供了访问 HTTP 协议的基本功能,但是对于⼤部分应⽤程序来说,JDK 库本⾝提供的功能还不够丰富和灵活。
HttpClient 是 Apache Jakarta Common 下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持 HTTP 协议最新的版本和建议。
HttpClient 已经应⽤在很多的项⽬中,⽐如 Apache Jakarta 上很著名的另外两个开源项⽬ Cactus 和 HTMLUnit 都使⽤了 HttpClient。
现在HttpClient最新版本为 HttpClient 4.0-beta22.HttpClient功能介绍以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
(1)实现了所有 HTTP 的⽅法(GET,POST,PUT,HEAD 等) (2)⽀持⾃动转向 (3)⽀持 HTTPS 协议 (4)⽀持代理服务器等3.HttpClient基本功能的使⽤(1) GET⽅法 使⽤ HttpClient 需要以下 6 个步骤: 1. 创建 HttpClient 的实例 2. 创建某种连接⽅法的实例,在这⾥是 GetMethod。
HttpClient 初读–HttpParams 的层级结构HttpClient 是基于java的Http Client端实现,其支持HTTP 1.0和HTTP 1.1, HttpClient自身对Http协议做了很多兼容,以便能和一些常用的Http 代理和Http server通信(这些代理和server没有严格按照协议标准来实现)。
HttpClient在本质上,是使用java的socket来和服务器通信,只不过通信的协议是采用HTTP协议而已。
所以,为了成功通信,需要设置很多参数,主要分(双方使用的协议版本号,是HTTP1.1还是HTTP1.0),为两种:HTTP协议相关参数,还有一些是网络通信参数,比如连接的超时时间,是否使用tcpnodelay等。
HttpClient中,接口HttpParams定义了这些参数的通用接口,查看HttpParams,我们可以发现HttpParams支持层级结构,及一个HttpParams可以是另外一个HttpParams的parent,且当查找一个特定参数时,将从当前HttpParams中进行查找,如果当前层级中没有,则从其parent中进行查找。
HttpParams的层级结构,是HttpClient设计上的一个特点。
这样的设计,使得能够灵活的对httpclient进行参数设置。
在HttpClient中,具体实现了如下几种HttpParam,其类图结构如下:HttpClient在设计上比较有特色的就是将这些参数实现为有层级的,查找一个具体的参数时,先从最低的级别的param开始查,如果没有,则向其父级参数查询,当查到时,总是返回最低级别的参数。
那么HttpClient为何要如此设计这种参数体系结构呢?这样的设计有什么好处呢?在使用HttpClient时,程序要要操作的主要是如下几个类:HttpClient,HttpConnectionManager,HttpConnection,HostConfiguration,HttpMethod。
javahttpclient设置超时时间和代理的⽅法设置超时时间设置HttpClient的超时时间,⾮常有必要性,因为httpclient 默认超时时间很长,⾃⼰可以测试⼀下是多久,设置超时时间否则会影响⾃⼰系统的业务逻辑,例如阻塞系统,影响系统的吞吐量,占⽤线程数。
httpclient 4.4版本之后将这些设置封装到 RequestConfig 对象⾥,其中 setConnectTimeout 是设置连接到⽬标 URL 的等待时长,超过这个时间还没连上就抛出连接超时;setConnectionRequestTimeout 是从connect Manager(连接池)获取连接的等待时长,这个版本是共享连接池的;setSocketTimeout 是连接到⽬标URL 之后等待返回响应的时长,即超过这个时间就放弃本次调⽤并抛出SocketTimeoutException:Read Time Outpublic static RequestConfig getRequestConfig(){RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000).setSocketTimeout(10000).setConnectionRequestTimeout(6000).build(); return requestConfig;}设置代理有时候我们线上访问外部第三⽅的接⼝的时候,不想暴露真实机器的IP,或者我们的机器不能访问外⽹的时候,我们可以通过代理服务器来访问,代理服务器充当内⽹与外⽹链接的中间⼈。
httpclient 4.4后设置代理的 IP、端⼝被封装到 RequestConfig 对象⾥,通过 HttpHost 对象封装代理的 IP、端⼝和协议。
这⾥需要注意的⼀点是,如果你的⽬标 URL 是 HTTP 协议的,那么你的代理也应该是 HTTP 协议的,如下 HttpHost 的构造⽅法可以指定代理服务的协议,不传默认为 HTTP。
HttpClient ⼊门教程学习HttpClient 简介HttpClient 是基于HttpCore 的兼容的HTTP 代理实现。
它还为客户端认证,HTTP 状态管理和HTTP 连接管理提供可重⽤组件。
HttpComponents Client 是Commons HttpClient 3.x 的继任者和替代者。
强烈建议Commons HttpClient 的⽤户进⾏升级。
HttpClient HTTP Get 请求HttpClient HTTP Post 请求HTTP/1.1/*** httpClient Get 请求*/public static void main(String[] args) throws IOException {try (CloseableHttpClient httpclient = HttpClients.createDefault()) {//第⼀步 配置 Get 请求 UrlHttpGet httpget = new HttpGet("/get"); //第⼆步 创建⼀个⾃定义的 response handlerResponseHandler<String> responseHandler = new ResponseHandler<String>() {@Overridepublic String handleResponse(HttpResponse response) throws IOException {int status = response.getStatusLine().getStatusCode(); if (status >= 200 && status < 300) {HttpEntity entity = response.getEntity();return entity != null ? EntityUtils.toString(entity) : null;} else {throw new ClientProtocolException("Unexpected response status: " + status); } }};//第三步 执⾏请求 String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);}}/*** httpClient Post 请求 */public static void main(String[] args) throws IOException {try (CloseableHttpClient httpclient = HttpClients.createDefault()) {//第⼀步 配置 Post 请求 UrlHttpPost httpPost = new HttpPost("/post");// 装配post 请求参数List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(); list.add(new BasicNameValuePair("age", "20")); //请求参数list.add(new BasicNameValuePair("name", "zhangsan")); //请求参数httpPost.setEntity(new StringEntity("Hello, World"));/*设置post 请求参数两个⽅式:具体参考UrlEncodedFormEntity 和StringEntity 区别*/httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8")); //httpPost.setEntity(new StringEntity(list.toString(), "UTF-8")); //第⼆步 创建⼀个⾃定义的 response handlerResponseHandler<String> responseHandler = new ResponseHandler<String>() {@Overridepublic String handleResponse(HttpResponse response) throws IOException {int status = response.getStatusLine().getStatusCode();if (status >= 200 && status < 300) {HttpEntity entity = response.getEntity();return entity != null ? EntityUtils.toString(entity) : null;} else {throw new ClientProtocolException("Unexpected response status: " + status);}}};};//第三步执⾏请求String responseBody = httpclient.execute(httpPost, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);}}HttpClient HTTP Put请求/*** httpClient Put 请求*/public static void main(String[] args) throws IOException {try (CloseableHttpClient httpclient = HttpClients.createDefault()) {//第⼀步配置 Post 请求 UrlHttpPut httpPut = new HttpPut("/put");//设置post请求参数httpPut.setEntity(new StringEntity("Hello, World"));//第⼆步创建⼀个⾃定义的 response handlerResponseHandler<String> responseHandler = new ResponseHandler<String>() {@Overridepublic String handleResponse(HttpResponse response) throws IOException {int status = response.getStatusLine().getStatusCode();if (status >= 200 && status < 300) {HttpEntity entity = response.getEntity();return entity != null ? EntityUtils.toString(entity) : null;} else {throw new ClientProtocolException("Unexpected response status: " + status); }}};String responseBody = httpclient.execute(httpPut, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);}}HttpClient HTTP Delete请求/*** httpClient Delete 请求*/public static void main(String[] args) throws IOException {try (CloseableHttpClient httpclient = HttpClients.createDefault()) {//第⼀步配置 Delete 请求 UrlHttpDelete httpDelete = new HttpDelete("/delete");System.out.println("Executing request " + httpDelete.getRequestLine());//第⼆步创建⼀个⾃定义的 response handlerResponseHandler<String> responseHandler = new ResponseHandler<String>() {@Overridepublic String handleResponse(HttpResponse response) throws IOException {int status = response.getStatusLine().getStatusCode();if (status >= 200 && status < 300) {HttpEntity entity = response.getEntity();return entity != null ? EntityUtils.toString(entity) : null;} else {throw new ClientProtocolException("Unexpected response status: " + status); }}};String responseBody = httpclient.execute(httpDelete, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);}}HttpClient⾃定义HTTP Header/*** HttpClient⾃定义HTTP头*/public static void main(String[] args)throws IOException {// 创建⾃定义 http headersList<Header> defaultHeaders = Arrays.asList(new BasicHeader("X-Default-Header", "default header httpclient"));// 设置⾃定义 http headersCloseableHttpClient httpclient = HttpClients.custom().setDefaultHeaders(defaultHeaders).build();try {// 配置超时时间RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) //设置连接超时时间.setConnectionRequestTimeout(5000) // 设置请求超时时间.setSocketTimeout(5000).setRedirectsEnabled(true)//默认允许⾃动重定向.build();// 创建⾃定义 http headers on the http requestHttpUriRequest request = RequestBuilder.get().setUri("/headers").setHeader(HttpHeaders.CONTENT_TYPE, "application/json").setHeader(HttpHeaders.FROM, "https://").setHeader("X-Custom-Header", "custom header http request").setConfig(requestConfig).build();System.out.println("Executing request " + request.getRequestLine());// 创建⾃定义 response handlerResponseHandler<String> responseHandler = response -> {int status = response.getStatusLine().getStatusCode();if (status >= 200 && status < 300) {HttpEntity entity = response.getEntity();return entity != null ? EntityUtils.toString(entity) : null;} else {throw new ClientProtocolException("Unexpected response status: " + status); }};String responseBody = httpclient.execute(request, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);} finally {httpclient.close();}}更详细HttpClient 学习。
JAVA代码实现HTTP请求的常用方法在Java中,有多种方法可以实现HTTP请求。
下面将介绍几种常用的方法。
1. 使用Java内置的URL类和HttpURLConnection类:```javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class HTTPRequestExamplepublic static void main(String[] args) throws ExceptionURL obj = new URL(url);HttpURLConnection con = (HttpURLConnection)obj.openConnection(;//设置请求方法con.setRequestMethod("GET");//添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");//获取响应码int responseCode = con.getResponseCode(;System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream());String inputLine;StringBuffer response = new StringBuffer(;while ((inputLine = in.readLine() != null)response.append(inputLine);}in.close(;//打印响应内容System.out.println(response.toString();}```2. 使用第三方库HttpClient:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception //创建GET请求//发送请求并获取响应//解析响应实体内容//打印响应内容System.out.println(response);// 关闭HttpClient连接}```3. 使用第三方库OkHttp:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception// 创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient(;// 创建Request对象Request request = new Request.Builder.url(url).build(;//发送请求并获取响应Response response = okHttpClient.newCall(request).execute(;String responseBody = response.body(.string(;//打印响应内容System.out.println(responseBody);}```4. 使用第三方库RestTemplate(Spring框架的一部分):```javaimport org.springframework.web.client.RestTemplate;public class HTTPRequestExamplepublic static void main(String[] args)// 创建RestTemplate对象RestTemplate restTemplate = new RestTemplate(;//发送GET请求,并获取响应ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);//获取响应内容String response = responseEntity.getBody(;//打印响应内容System.out.println(response);}```这些方法提供了不同的方式来实现HTTP请求,使用Java内置的URL 类和HttpURLConnection类相对简单,但是需要自己处理底层连接和数据读取。
HTTPClient入门HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。
本文首先介绍HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。
HttpClient简介HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。
虽然在JDK 的 包中已经提供了访问HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
HttpClient 是Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。
HttpClient 已经应用在很多的项目中,比如Apache Jakarta 上很著名的另外两个开源项目Cactus 和HTMLUnit 都使用了HttpClient,更多使用HttpClient 的应用可以参见/jakarta-httpclient/HttpClientPowered。
HttpClient 项目非常活跃,使用的人还是非常多的。
目前HttpClient 版本是在2005.10.11 发布的 3.0 RC4 。
HttpClient 功能介绍以下列出的是HttpClient 提供的主要的功能,要知道更多详细的功能可以参见HttpClient 的主页。
实现了所有HTTP 的方法(GET,POST,PUT,HEAD 等)支持自动转向支持HTTPS 协议支持代理服务器等下面将逐一介绍怎样使用这些功能。
首先,我们必须安装好HttpClient。
HttpClient 可以在/commons/httpclient/downloads.html下载HttpClient 用到了Apache Jakarta common 下的子项目logging,你可以从这个地址/site/downloads/downloads_commons-logging.cgi 下载到common logging,从下载后的压缩包中取出commons-logging.jar 加到CLASSPATH 中HttpClient 用到了Apache Jakarta common 下的子项目codec,你可以从这个地址/site/downloads/downloads_commons-codec.cgi 下载到最新的common codec,从下载后的压缩包中取出commons-codec-1.x.jar 加到CLASSPATH 中HttpClient 基本功能的使用GET 方法使用HttpClient 需要以下6 个步骤:1. 创建HttpClient 的实例2. 创建某种连接方法的实例,在这里是GetMethod。
在GetMethod 的构造函数中传入待连接的地址3. 调用第一步中创建好的实例的execute 方法来执行第二步中创建好的method 实例4. 读response5. 释放连接。
无论执行方法是否成功,都必须释放连接6. 对得到后的内容进行处理根据以上步骤,我们来编写用GET方法来取得某网页内容的代码。
大部分情况下HttpClient 默认的构造函数已经足够使用。
HttpClient httpClient = new HttpClient();创建GET方法的实例。
在GET方法的构造函数中传入待连接的地址即可。
用GetMethod将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。
GetMethod getMethod = new GetMethod("/");调用实例httpClient的executeMethod方法来执行getMethod。
由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。
引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常(IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。
HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。
通过httpClient的方法setParameter 设置你实现的恢复策略,本文中使用的是系统提供的默认恢复策略,该策略在碰到第二类异常的时候将自动重试3次。
executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)等。
//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());//执行getMethodint statusCode = client.executeMethod(getMethod);if (statusCode != HttpStatus.SC_OK) {System.err.println("Method failed: " + getMethod.getStatusLine());}在返回的状态码正确后,即可取得内容。
取得目标地址的内容有三种方法:第一种,getResponseBody,该方法返回的是目标的二进制的byte 流;第二种,getResponseBodyAsString,这个方法返回的是String类型,值得注意的是该方法返回的String 的编码是根据系统默认的编码方式,所以返回的String值可能编码类型有误,在本文的"字符编码"部分中将对此做详细介绍;第三种,getResponseBodyAsStream,这个方法对于目标地址中有大量数据需要传输是最佳的。
在这里我们使用了最简单的getResponseBody方法。
byte[] responseBody = method.getResponseBody();释放连接。
无论执行方法是否成功,都必须释放连接。
method.releaseConnection();处理内容。
在这一步中根据你的需要处理内容,在例子中只是简单的将内容打印到控制台。
System.out.println(new String(responseBody));下面是程序的完整代码,这些代码也可在附件中的test.GetSample中找到。
package test;import java.io.IOException;import mons.httpclient.*;import mons.httpclient.methods.GetMethod;import mons.httpclient.params.HttpMethodParams;public class GetSample{public static void main(String[] args) {//构造HttpClient的实例HttpClient httpClient = new HttpClient();//创建GET方法的实例GetMethod getMethod = new GetMethod("");//使用系统提供的默认的恢复策略getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());try {//执行getMethodint statusCode = httpClient.executeMethod(getMethod);if (statusCode != HttpStatus.SC_OK) {System.err.println("Method failed: "+ getMethod.getStatusLine());}//读取内容byte[] responseBody = getMethod.getResponseBody();//处理内容System.out.println(new String(responseBody));} catch (HttpException e) {//发生致命的异常,可能是协议不对或者返回的内容有问题System.out.println("Please check your provided http address!");e.printStackTrace();} catch (IOException e) {//发生网络异常e.printStackTrace();} finally {//释放连接getMethod.releaseConnection();}}}POST方法根据RFC2616,对POST的解释如下:POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。
POST被设计成用统一的方法实现下列功能:对现有资源的注释(Annotation of existing resources)向电子公告栏、新闻组,邮件列表或类似讨论组发送消息提交数据块,如将表单的结果提交给数据处理过程通过附加操作来扩展数据库调用HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩下的步骤都差不多。
在下面的例子中,省去了与GetMethod 相同的步骤,只说明与上面不同的地方,并以登录清华大学BBS为例子进行说明。
构造PostMethod之前的步骤都相同,与GetMethod一样,构造PostMethod也需要一个URI参数,在本例中,登录的地址是http: ///bbslogin2.php。