HttpClient 简介
client帮助文档

前言超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了。
Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web 浏览器范畴,同时,也增加了需要HTTP协议支持的应用程序的数量。
尽管包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。
HttpClient就是寻求弥补这项空白的组件,通过提供一个有效的,保持更新的,功能丰富的软件包来实现客户端最新的HTTP标准和建议。
为扩展而设计,同时为基本的HTTP协议提供强大的支持,HttpClient组件也许就是构建HTTP客户端应用程序,比如web浏览器,web服务端,利用或扩展HTTP协议进行分布式通信的系统的开发人员的关注点。
1. HttpClient的范围基于HttpCore[/httpcomponents-core/index.html]的客户端HTTP运输实现库基于经典(阻塞)I/O内容无关2. 什么是HttpClient不能做的HttpClient 不是一个浏览器。
它是一个客户端的HTTP通信实现库。
HttpClient的目标是发送和接收HTTP报文。
HttpClient不会去缓存内容,执行嵌入在HTML页面中的javascript 代码,猜测内容类型,重新格式化请求/重定向URI,或者其它和HTTP运输无关的功能。
第一章基础1.1 执行请求HttpClient 最重要的功能是执行HTTP方法。
一个HTTP方法的执行包含一个或多个HTTP 请求/HTTP响应交换,通常由HttpClient的内部来处理。
而期望用户提供一个要执行的请求对象,而HttpClient期望传输请求到目标服务器并返回对应的响应对象,或者当执行不成功时抛出异常。
很自然地,HttpClient API的主要切入点就是定义描述上述规约的HttpClient接口。
这里有一个很简单的请求执行过程的示例:HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet("http://localhost/");HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();if (entity != null) {InputStream instream = entity.getContent();int l;byte[] tmp = new byte[2048];while ((l = instream.read(tmp)) != -1) {}}1.1.1 HTTP请求所有HTTP请求有一个组合了方法名,请求URI和HTTP协议版本的请求行。
使用HttpClient实现文件的上传下载方法

使⽤HttpClient实现⽂件的上传下载⽅法1 HTTPHTTP 协议可能是现在 Internet 上使⽤得最多、最重要的协议了,越来越多的 Java 应⽤程序需要直接通过 HTTP 协议来访问⽹络资源。
虽然在 JDK 的 包中已经提供了访问 HTTP 协议的基本功能,但是对于⼤部分应⽤程序来说,JDK 库本⾝提供的功能还不够丰富和灵活。
HttpClient ⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持HTTP 协议最新的版本和建议。
⼀般的情况下我们都是使⽤Chrome或者其他浏览器来访问⼀个WEB服务器,⽤来浏览页⾯查看信息或者提交⼀些数据、⽂件上传下载等等。
所访问的这些页⾯有的仅仅是⼀些普通的页⾯,有的需要⽤户登录后⽅可使⽤,或者需要认证以及是⼀些通过加密⽅式传输,例如HTTPS。
⽬前我们使⽤的浏览器处理这些情况都不会构成问题。
但是⼀旦我们有需求不通过浏览器来访问服务器的资源呢?那该怎么办呢?下⾯以本地客户端发起⽂件的上传、下载为例做个⼩Demo。
HttpClient有两种形式,⼀种是org.apache.http下的,⼀种是mons.httpclient.HttpClient。
2 ⽂件上传⽂件上传可以使⽤两种⽅式实现,⼀种是PostMethod⽅式,⼀种是HttpPost⽅式。
两者的处理⼤同⼩异。
PostMethod是使⽤FileBody将⽂件包装流包装起来,HttpPost是使⽤FilePart将⽂件流包装起来。
在传递⽂件流给服务端的时候,都可以同时传递其他的参数。
2.1 客户端处理2.1.1 PostMethod⽅式将⽂件封装到FilePart中,放⼊Part数组,同时,其他参数可以放⼊StringPart中,这⾥没有写,只是单纯的将参数以setParameter的⽅式进⾏设置。
此处的HttpClient是mons.httpclient.HttpClient。
浅谈HttpClient、okhttp和RestTemplate的区别

浅谈HttpClient、okhttp和RestTemplate的区别⼀、HttpClient1、pom依赖<!--HttpClient--><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency>2、HttpClient代码实现public class HttpClientUtil {/*** httpClient的get请求⽅式* 使⽤GetMethod来访问⼀个URL对应的⽹页实现步骤:* 1.⽣成⼀个HttpClient对象并设置相应的参数;* 2.⽣成⼀个GetMethod对象并设置响应的参数;* 3.⽤HttpClient⽣成的对象来执⾏GetMethod⽣成的Get⽅法;* 4.处理响应状态码;* 5.若响应正常,处理HTTP响应内容;* 6.释放连接。
* @param url* @param charset* @return*/public static String doGet(String url, String charset) {//1.⽣成HttpClient对象并设置参数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());String response = "";//3.执⾏HTTP GET 请求try {int statusCode = httpClient.executeMethod(getMethod);//4.判断访问的状态码if (statusCode != HttpStatus.SC_OK) {System.err.println("请求出错:" + 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();response = new String(responseBody, charset);System.out.println("-----------response:" + response);//读取为InputStream,在⽹页内容数据量⼤时候推荐使⽤//InputStream response = getMethod.getResponseBodyAsStream();} catch (HttpException e) {//发⽣致命的异常,可能是协议不对或者返回的内容有问题System.out.println("请检查输⼊的URL!");e.printStackTrace();} catch (IOException e) {//发⽣⽹络异常System.out.println("发⽣⽹络异常!");} finally {//6.释放连接getMethod.releaseConnection();}return response;}/*** post请求* @param url* @param json* @return*/public static String doPost(String url, JSONObject json){HttpClient httpClient = new HttpClient();PostMethod postMethod = new PostMethod(url);postMethod.addRequestHeader("accept", "*/*");postMethod.addRequestHeader("connection", "Keep-Alive");//设置json格式传送postMethod.addRequestHeader("Content-Type", "application/json;charset=GBK");//必须设置下⾯这个HeaderpostMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"); //添加请求参数postMethod.addParameter("commentId", json.getString("commentId"));String res = "";try {int code = httpClient.executeMethod(postMethod);if (code == 200){res = postMethod.getResponseBodyAsString();System.out.println(res);}} catch (IOException e) {e.printStackTrace();}return res;}public static void main(String[] args) {System.out.println(doGet("/cc/json/mobile_tel_segment.htm?tel=130********", "GBK"));System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");JSONObject jsonObject = new JSONObject();jsonObject.put("commentId", "130********");System.out.println(doPost("/cc/json/mobile_tel_segment.htm?tel=130********", jsonObject));}}3、建议代码复杂,还得操⼼资源回收等。
异步httpclient(httpasyncclient)的使用与总结

异步httpclient(httpasyncclient)的使⽤与总结参考:1. 前⾔应⽤层的⽹络模型有同步与异步。
同步意味当前线程是阻塞的,只有本次请求完成后才能进⾏下⼀次请求;异步意味着所有的请求可以同时塞⼊缓冲区,不阻塞当前的线程;httpclient在4.x之后开始提供基于nio的异步版本httpasyncclient,httpasyncclient借助了Java并发库和nio进⾏封装(虽说NIO是同步⾮阻塞IO,但是HttpAsyncClient提供了回调的机制,与netty类似,所以可以模拟类似于AIO的效果),其调⽤⽅式⾮常便捷,但是其中也有许多需要注意的地⽅。
2. pom⽂件本⽂依赖4.1.2,当前最新的客户端版本是4.1.3maven repository 地址<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore-nio</artifactId><version>4.4.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpasyncclient</artifactId><version>4.1.2</version></dependency>12345678910111213141516171819202122233. 简单的实例public class TestHttpClient {public static void main(String[] args){RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(50000).setSocketTimeout(50000).setConnectionRequestTimeout(1000).build();//配置io线程IOReactorConfig ioReactorConfig = IOReactorConfig.custom().setIoThreadCount(Runtime.getRuntime().availableProcessors()).setSoKeepAlive(true).build();//设置连接池⼤⼩ConnectingIOReactor ioReactor=null;try {ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);} catch (IOReactorException e) {e.printStackTrace();}PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor); connManager.setMaxTotal(100);connManager.setDefaultMaxPerRoute(100);final CloseableHttpAsyncClient client = HttpAsyncClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(requestConfig).build();//构造请求String url = "http://127.0.0.1:9200/_bulk";HttpPost httpPost = new HttpPost(url);StringEntity entity = null;try {String a = "{ \"index\": { \"_index\": \"test\", \"_type\": \"test\"} }\n" +"{\"name\": \"上海\",\"age\":33}\n";entity = new StringEntity(a);} catch (UnsupportedEncodingException e) {e.printStackTrace();}httpPost.setEntity(entity);//startclient.start();//异步请求client.execute(httpPost, new Back());while(true){try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}static class Back implements FutureCallback<HttpResponse>{private long start = System.currentTimeMillis();Back(){}public void completed(HttpResponse httpResponse) {try {System.out.println("cost is:"+(System.currentTimeMillis()-start)+":"+EntityUtils.toString(httpResponse.getEntity())); } catch (IOException e) {e.printStackTrace();}}public void failed(Exception e) {System.err.println(" cost is:"+(System.currentTimeMillis()-start)+":"+e);}public void cancelled() {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66717273747576777879808182834. ⼏个重要的参数4.1 TimeOut(3个)的设置ConnectTimeout : 连接超时,连接建⽴时间,三次握⼿完成时间。
HttpClient源码分析

HttpClient源码分析/*** 此接⼝仅代表HTTP请求执⾏的最基本约定。
* 它对请求执⾏过程没有任何限制或特定的细节,并将状态管理、⾝份验证和重定向处理的细节留给单个实现。
*/public interface HttpClient {HttpResponse execute(HttpUriRequest request);}/*** ⽤于提供创建{@link CloseableHttpClient}实例⼯⼚⽅法.*/public class HttpClients {public static CloseableHttpClient createDefault() {return HttpClientBuilder.create().build();}}/*** HTTP消息包括从客户机到服务器的请求和从服务器到客户机的响应。
* HTTP-message = Request | Response ; HTTP/1.1 messages** {@link HttpRequest} and {@link HttpResponse} 接⼝继承{@link HttpMessage }*/public interface HttpMessage {}/*** 从客户机到服务器的请求消息包括,* 在该消息的第⼀⾏中,要应⽤于该资源的⽅法、资源的标识符以及正在使⽤的协议版本。
* method uri http/1.1*/public interface HttpRequest extends HttpMessage {RequestLine getRequestLine(); // 获取请求⾏}/*** 在接收和解释请求消息后,服务器⽤HTTP响应消息响应。
* 设置/获取状态⾏、状态码、原因短语、实体、locale*/public interface HttpResponse extends HttpMessage {}/*** Extended version of the {@link HttpRequest} interface that provides convenience methods to access request properties such as request URI and method type. * {@link HttpRequest}接⼝的扩展版本,提供访问请求属性(如请求URI和⽅法类型)的⽅便⽅法。
HttpClient、RestTemplate和Feign相关知识

HttpClient、RestTemplate和Feign相关知识#先了解⼀下HTTP 协议史前时期 HTTP 协议在我们的⽣活中随处可见,打开⼿机或者电脑,只要你上⽹,不论是⽤ iPhone、Android、Windows 还是 Mac,不论是⽤浏览器还是 App,不论是看新闻、短视频还是听⾳乐、玩游戏,后⾯总会有 HTTP 在默默为你服务。
据 NetCraft 公司统计,⽬前全球⾄少有 16 亿个⽹站、2 亿多个独⽴域名,⽽这个庞⼤⽹络世界的底层运转机制就是 HTTP。
那么,在享受如此便捷舒适的⽹络⽣活时,你有没有想过,HTTP 协议是怎么来的?它最开始是什么样⼦的?⼜是如何⼀步⼀步发展到今天,⼏乎“统治”了整个互联⽹世界的呢? 20 世纪 60 年代,美国国防部⾼等研究计划署(ARPA)建⽴了 ARPA ⽹,它有四个分布在各地的节点,被认为是如今互联⽹的“始祖”。
然后在 70 年代,基于对 ARPA ⽹的实践和思考,研究⼈员发明出了著名的 TCP/IP 协议。
由于具有良好的分层结构和稳定的性能,TCP/IP 协议迅速战胜其他竞争对⼿流⾏起来,并在 80 年代中期进⼊了 UNIX 系统内核,促使更多的计算机接⼊了互联⽹。
创世纪 1989 年,任职于欧洲核⼦研究中⼼(CERN)的蒂姆·伯纳斯 - 李(Tim Berners-Lee)发表了⼀篇论⽂,提出了在互联⽹上构建超链接⽂档系统的构想。
这篇论⽂中他确⽴了三项关键技术。
URI:即统⼀资源标识符,作为互联⽹上资源的唯⼀⾝份;HTML:即超⽂本标记语⾔,描述超⽂本⽂档;HTTP:即超⽂本传输协议,⽤来传输超⽂本。
所以在这⼀年,我们的HTTP诞⽣了。
HTTP/0.9 20 世纪 90 年代初期的互联⽹世界⾮常简陋,计算机处理能⼒低,存储容量⼩,⽹速很慢,还是⼀⽚“信息荒漠”。
⽹络上绝⼤多数的资源都是纯⽂本,很多通信协议也都使⽤纯⽂本,所以 HTTP 的设计也不可避免地受到了时代的限制。
HttpClient组件及其在Android开发中的应用探讨

黪
耱
’l 与 应 用
Ht t p C l i e n t 组件及其在 A n d r o i d 开发中的应用探讨
徐婉珍
( 南海 东软信 息技 术 学 院 广 东佛 山 5 2 8 2 0 0 )
摘要 : 本文介 绍 了Ht t p C l i e n t  ̄ - @在w e b 应用 开发 中的作 用及 基本 使 用方 法 , 并探 讨 了在A n d r o i d 手机 客 户端 开发 中的 实际应 议 是 目前I n t e r n e t J 2 使用得最多 、 最重要 的协议 , 除了 以B / S 模式( B r o ws e r / S e r v e r ) 开发 的we b 应用 系统之外 , 各类基于 网络 的设 备 、 网络 计 算 的 发展 等 , 都 在 不 断地 扩 展 着 HT T P 的 应 用 领域 。 此外 , 即使 是 采用 了B / S 模 式提 供 的信 息 服 务 , 有 时 也需 要 通 过定制的客户端程序 而非用户驱动 的浏览器 来访 问服务器 资源 。 Ht t p C l i e n t 组件为我们编写这一类J a v a 客户端程序提供了便捷有效 的 访 问手 段 。
程序 。 为了支持 手机客户端的查询 , 需编写根据用户名及时间点查询 公告 的We b 页面 , 该页面( g e t N e ws . j s p ) 查询用 户的最新 公告 , 结果 以格式化字符 串的形式返 回。 限于篇幅 , 此代码略过 。 3 . 2手机 客 户端 的 开发 手机用户通过企业 内部的用户名和密码登录系统后, 启动后 台
关键词 : Ht t p Cl i e n t We b 客 户端 中图 分类 号 : T P 3 l 1 . 5 2 An d r o i d : F F 发 文 献标 识码 : A
对于System_Net_Http的学习System_Net_Http 简介

使用HttpClient 进行连接使用 .Http 命名空间中的 HttpClient 类可以向 WebService发送 POST与GET 请求并检索响应数据。
.Http 命名空间中的类可为现代 HTTP 应用提供编程接口。
.Http 命名空间和相关的 .Http.Headers 命名空间提供的 HTTP 客户端组件,允许用户通过 HTTP 使用现代的 WebService。
HttpClient 类用于通过 HTTP 发送和接收基本要求。
它提供了一个用于从 URI 所标识的资源发送 HTTP 请求和接收 HTTP 响应的基类。
该类可用来向 Web Service发送 GET、PUT、POST、DELETE 以及其他请求。
上述每种请求都作为异步操作进行发送。
HttpResponseMessage 类用于声明从 HTTP 请求接收到的 HTTP 响应消息。
HTTP 消息由 IETF 在 RFC 2616 中进行定义。
HttpContent 类是用于声明 HTTP 实体正文和内容标题的基类。
在这种情况下,HttpContent 用于声明 HTTP 响应。
以下示例使用 .NET Framework 4.0 的 C#。
同时你必须对 RFC 2616 中详细描述的 HTTP 请求有基本的了解。
一、创建新项目1. 打开Microsoft Visual Studio 2010,然后从“文件”菜单中选择“新建项目”。
在模板列表中,选择Visual C#。
在该区域下面,选择“Windows应用程序应用”,然后选择“空白应用程序”。
将该应用程序命名为winHttpClientBase,然后单击“确定”。
2. 添加Microsoft HTTP Client Libraries的引用如下图1,图2,图3,图4。
图1图2图3图4二、设置启用网络访问的功能需要为应用设置网络功能,以启用家庭网络或工作网络以及 Internet 的访问。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。
在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(newString(responseBody));下面是程序的完整代码,这些代码也可在附件中的test.GetSample 中找到。
package test;import java.io.IOException;import mons.httpclient.*;import mons.httpclient.methods.GetMethod;importmons.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();}}}(2)POST方法根据RFC2616,对POST的解释如下:POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。
POST被设计成用统一的方法实现下列功能:对现有资源的注释(Annotation of existing resources)向电子公告栏、新闻组,邮件列表或类似讨论组发送消息提交数据块,如将表单的结果提交给数据处理过程通过附加操作来扩展数据库调用HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩下的步骤都差不多。
在下面的例子中,省去了与GetMethod相同的步骤,只说明与上面不同的地方,并以登录清华大学BBS为例子进行说明。
构造PostMethod之前的步骤都相同,与GetMethod一样,构造PostMethod也需要一个URI参数。
在创建了PostMethod的实例之后,需要给method实例填充表单的值,在BBS的登录表单中需要有两个域,第一个是用户名(域名叫id),第二个是密码(域名叫passwd)。
表单中的域用类NameValuePair来表示,该类的构造函数第一个参数是域名,第二参数是该域的值;将表单所有的值设置到PostMethod中用方法setRequestBody。
另外由于BBS登录成功后会转向另外一个页面,但是HttpClient对于要求接受后继服务的请求,比如POST和PUT,不支持自动转发,因此需要自己对页面转向做处理。
具体的页面转向处理请参见下面的"自动转向"部分。
代码如下:String url = "....";PostMethod postMethod = new PostMethod(url);// 填入各个表单域的值NameValuePair[] data = { new NameValuePair("id", "youUserName"),new NameValuePair("passwd", "yourPwd") };// 将表单的值放入postMethod中postMethod.setRequestBody(data);// 执行postMethodint statusCode = httpClient.executeMethod(postMethod);// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发// 301或者302if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {// 从头中取出转向的地址Header locationHeader =postMethod.getResponseHeader("location");String location = null;if (locationHeader != null) {location = locationHeader.getValue();System.out.println("The page was redirected to:" + location);} else {System.err.println("Location field value is null.");}return;}[编辑本段]4 使用HttpClient过程中常见的一些问题下面介绍在使用HttpClient过程中常见的一些问题。