HttpClient实现远程调用
来源:互联网 发布:linux tomcat假死监控 编辑:程序博客网 时间:2024/06/08 14:43
HttpClient 功能介绍 (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自动转向 (3)支持 HTTPS 协议 (4)支持代理服务器等 HttpClient 基本功能的使用:共要3个Jar包 commons-codec.jar commons-httpclient.jar commons-logging.jar (1) GET方法 使用 HttpClient 需要以下 6 个步骤: 1. 创建 HttpClient 的实例 HttpClient httpClient = new HttpClient(); GetMethod method =null 2. 创建某种连接方法的实例。在构造函数中传入待连接的地址 method=new GetMethod(url); 3. 调用HttpClient的 execute 方法来执行GetMethod 实例 int retcode = httpClient.executeMethod(method); if (retcode != HttpStatus.SC_OK) {// 发送不成功 facesMessages.add("查询出错不成功"); } else { 4. 读 response —— body = method.getResponseBodyAsString(); } 5. 释放连接。无论执行方法是否成功,都必须释放连接 if (method != null) { method.releaseConnection(); } 6. 对得到后的内容进行处理 备注: httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); method.setRequestHeader("Connection", "close"); //解决Httpclient远程请求所造成Socket没有释放 method=new GetMethod(url); method.addRequestHeader("Accept", "text/plain"); method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); (2)POST方法 POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能: 对现有资源的注释(Annotation of existing resources) 向电子公告栏、新闻组,邮件列表或类似讨论组发送消息 提交数据块,如将表单的结果提交给数据处理过程 通过附加操作来扩展数据库 1. 创建 HttpClient 的实例 HttpClient httpClient = new HttpClient(); PostMethod postMethod=null; 2. 创建某种连接方法的实例。在构造函数中传入待连接的地址 method=new GetMethod(url); 填入各个表单域的值 NameValuePair[] data = { new NameValuePair("id", "youUserName"), new NameValuePair("passwd", "yourPwd") }; 将表单的值放入postMethod中 postMethod.setRequestBody(data); 3. 调用HttpClient的 execute 方法来执行PostMethod实例 int statusCode = httpClient.executeMethod(method); if (statusCode!= HttpStatus.SC_OK) {// 发送不成功 facesMessages.add("查询出错不成功"); } else { 4. 读 response —— body = method.getResponseBodyAsString(); } 5. 释放连接。无论执行方法是否成功,都必须释放连接 if (method != null) { method.releaseConnection(); } 6. 对得到后的内容进行处理 备注: HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发 // 301或者302 if (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; } 3使用HttpClient过程中常见的一些问题 字符编码 通过method对象的getResponseCharSet()方法就可以得到http头中的编码信息 自动转向 根据RFC2616中对自动转向的定义,主要有两种:301和302。301表示永久的移走 (Moved Permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。302表示暂时 的转向,比如在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中 location的值就是sendRedirect转向的目标地址。 HttpClient支持自动转向处理,但是象POST和PUT方式这种要求接受后继服务的请求方式,暂时不支持自动转向,因此如果碰到POST方式提交 后返回的是301或者302的话需要自己处理。就像刚才在POSTMethod中举的例子:如果想进入登录BBS后的页面,必须重新发起登录的请求,请求的地址可以在头字段location中得到。不过需要注意的是,有时候location返回的可能是相对路径,因此需要对location返回的值做一些 处理才可以发起向新地址的请求。 另外除了在头中包含的信息可能使页面发生重定向外,在页面中也有可能会发生页面的重定向。引起页面自动转发的标签是:<meta http-equiv="refresh" content="5; url=....">。如果你想在程序中也处理这种情况的话得自己分析页面来实现转向。需要注意的是,在上面那个标签中url的值也可以是一个相对 地址,如果是这样的话,需要对它做一些处理后才可以转发 5 处理代理服务器 HttpClient中使用代理服务器非常简单,调用HttpClient中setProxy方法就可以,方法的第一个参数是代理服务器地址,第二个参数是端口号。另外HttpClient也支持SOCKS代理。 httpClient.getHostConfiguration().setProxy(hostName,port); 扩展阅读: 1.http://hc.apache.org/httpclient-3.x/ HttpClient官方网站 2.http://jakarta.apache.org/commons/httpclient/ HttpClient首页 3.http://hc.apache.org/downloads.cgi HttpClient下载 4.http://www.leadtoit.cn/subject.php?id=6 力度IT网HttpClient专题 5.http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html HttpClient 学习整理 6.http://www.ibm.com/developerworks/cn/opensource/os-httpclient/ HttpClient入门 7.http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx 应用HttpClient来对付各种顽固的WEB服务器 8.http://www.pmjava.com/Article/ShowInfo.asp?ID=2147 httpclient 4.0的例子 实例 : private void send(String url,String requestXml){ String body = ""; PostMethod postMethod=null; try { HttpClient httpClient = new HttpClient(); httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); postMethod=new PostMethod(url); NameValuePair[] dataxml = { new NameValuePair("data", requestXml)}; postMethod.setRequestBody(dataxml); postMethod.addRequestHeader("Accept", "text/plain"); postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); postMethod.setRequestHeader("Connection", "close"); int retcode = httpClient.executeMethod(postMethod); if (retcode != HttpStatus.SC_OK) {// 发送不成功 facesMessages.add("查询出错不成功"); } else { body = postMethod.getResponseBodyAsString(); if ("201".equals(body) ) { facesMessages.add("您对编号为" + complaint.getNumber() + "的投诉做“待改进”操作成功,即发送其到了QSI系统!!"); } else { facesMessages.add("您对编号为" + complaint.getNumber() + "的投诉做“待改进”操作失败!!"); } } } catch (Exception e) { facesMessages.add("对不起,由于发生某种异常而未能正常查询订单信息。请重新再试!!!"); log.error("", e, ""); }finally{ if (postMethod != null) { postMethod.releaseConnection(); } } }
博文转自:http://blog.csdn.net/charlies_fu/article/details/7948977
阅读全文
0 0
- HttpClient实现远程调用
- HttpClient实现远程调用
- httpClient实现远程调用 备案
- httpclient远程调用
- Httpclient远程调用WebService示例(Eclipse+httpclient
- Httpclient远程调用WebService示例(Eclipse+httpclient)
- Httpclient远程调用WebService示例(Eclipse+httpclient)
- Httpclient远程调用WebService示例(Eclipse+httpclient)
- HttpClient实现远程发送servlet通信
- Spring实现远程调用
- rmi实现远程调用
- Hessian实现远程调用
- CXF实现远程调用
- 经验分享:使用HttpClient做远程方法调用
- 使用httpclient实现http接口调用实例
- 使用httpclient实现http接口调用实例
- 使用httpclient实现http接口调用实例
- 使用httpclient实现http接口调用实例
- Collection接口和迭代器
- CS231n学习笔记--14. Reinforcement Learning
- 约瑟夫问题
- Spring工程,测试类编写demo
- IE9下MP3音频倍速播放及调整音量存在延迟的可能原因
- HttpClient实现远程调用
- 使用jenkins完成参数化构建-集成git和ssh-未完待续
- HDOJ2072 单词数
- JS 里为什么会有 this
- 2017.11.6作业
- 重拾算法之排序(一):直接插入排序
- (重要!)Spring AOP概念理解 (通俗易懂)
- Redis之RedisTemplate常用接口详解
- 随记-搜索技巧