




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HttpClient4.1 Tutorial利用官方例子讲解httpClient4.1的用法HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文利用官方例子来介绍HttpClient的用法。wanghe2011-3-14目 录HttpClient简介41)百科名片:42)HttpClient 的范围43)httpClient 特性4HttpClient基本功能的使用6a)环境准备6b)几个主要类解释6c)第一个程序6d)如何传递参数8e)模拟表单登录10f)HttpClient连接SSL121)生成KeyStore122)配置tomcat服务器支持SSL133)用浏览器访问你的应用154)用httpClient访问https15教程版本说明作者0.9第一个版本.仅简单的几个例子和SSL访问wangheHttpClient简介1) 百科名片:HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.1.2) HttpClient 的范围 基于HttpCore的客户端HTTP运输实现库 基于经典(阻塞)I/O 内容无关3) 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 认证方案. 插件式的自定义认证方案. 便携可靠的套接字工厂使它更容易的使用第三方解决方案. 连接管理器支持多线程应用.支持设置最大连接数,同时支持设置每个主机的最大连接数.发现并关闭过期的连接. Automatic Cookie handling for reading Set-Cookie: headers from the server and sending them back out in a Cookie: header when appropriate. 插件式的自定义Cookie策略. Request output streams to avoid buffering any content body by streaming directly to the socket to the server. Response input streams to efficiently read the response body by streaming directly from the socket to the server. 在http1.0和http1.1中利用KeepAlive保持持久连接. 直接获取服务器发送的response code和 headers. 设置连接超时的能力. 实验性的支持http1.1 response caching. 源代码基于Apache License 可免费获取.HttpClient基本功能的使用a) 环境准备 从apache下载httpClient; 下载地址: /downloads.cgi; 解压、将lib下的jar导入工程;b) 几个主要类解释类名作用HttpClientHttpClient代表了一个http的客户端,HttpClient接口定义了大多数基本的http请求执行行为.HttpEntityentity是发送或者接收消息的载体。entities 可以通过request和response获取到.HttpConnectionHttpConnection代表了一个http连接。c) 第一个程序说明: 用get方法访问并返回内容Code: Testing Code:/创建默认的httpClient实例.HttpClient httpclient = new DefaultHttpClient();try /创建httpget. HttpGet httpget = new HttpGet(/);System.out.println(executing request + httpget.getURI();/执行get请求. HttpResponse response = httpclient.execute(httpget);/获取响应实体 HttpEntity entity = response.getEntity();System.out.println(-);/打印响应状态 System.out.println(response.getStatusLine(); if (entity != null) /打印响应内容长度 System.out.println(Response content length: + entity.getContentLength();/打印响应内容 System.out.println(Response content: + EntityUtils.toString(entity); System.out.println(-); finally /关闭连接,释放资源 httpclient.getConnectionManager().shutdown(); 输出:executing request /-HTTP/1.1 200 OKResponse content length: 6759Response content: 百度一下,你就知道 (此处省略打印信息)-d) 如何传递参数说明: 用post方法访问本地应用并根据传递参数不同返回不同结果Code: Struts2配置: Action Code:public void serivceJ() try HttpServletResponse response = ServletActionContext.getResponse(); HttpServletRequest request = ServletActionContext.getRequest(); System.out.println(request.serivceJ); response.setCharacterEncoding(UTF-8); String type = request.getParameter(type); String c = none; if(type.equalsIgnoreCase(car) c = Hello:给你一辆宝马; else if(type.equalsIgnoreCase(house) c = Hello:给你一栋别墅; response.getWriter().write(c); catch (IOException e) e.printStackTrace();TestingCode:/创建默认的httpClient实例.HttpClient httpclient = new DefaultHttpClient();/创建httppostHttpPost httppost = new HttpPost(http:/localhost:8080/myDemo/Ajax/serivceJ.action);/创建参数队列List formparams = new ArrayList();formparams.add(new BasicNameValuePair(type, house);UrlEncodedFormEntity uefEntity;try uefEntity = new UrlEncodedFormEntity(formparams, UTF-8);httppost.setEntity(uefEntity);System.out.println(executing request + httppost.getURI();HttpResponse response;response = httpclient.execute(httppost);HttpEntity entity = response.getEntity();if (entity != null) System.out.println(-);System.out.println(Response content: + EntityUtils.toString(entity,UTF-8);System.out.println(-); catch (ClientProtocolException e) e.printStackTrace();catch(UnsupportedEncodingException e1) e1.printStackTrace();catch (IOException e) e.printStackTrace();finally /关闭连接,释放资源httpclient.getConnectionManager().shutdown();输出:executing request http:/localhost:8080/myDemo/Ajax/serivceJ.action-Response content: Hello:给你一栋别墅-e) 模拟表单登录说明: 用post方法登录本地应用Code: Struts2配置: /index.jsp /error.jsp Action Code:public String serivceJ() HttpServletRequest request = ServletActionContext.getRequest(); System.out.println(request.serivceJ); String username = request.getParameter(username);String password = request.getParameter(password); if(username.equalsIgnoreCase(admin)& password.equalsIgnoreCase(123456) return success; return error;TestingCode:/创建默认的httpClient实例.HttpClient httpclient = new DefaultHttpClient();/创建httppostHttpPost httppost = new HttpPost(http:/localhost:8080/myDemo/Ajax/serivceJ.action);/创建参数队列List formparams = new ArrayList();formparams.add(new BasicNameValuePair(username, admin);formparams.add(new BasicNameValuePair(password, 123456);UrlEncodedFormEntity uefEntity;try uefEntity = new UrlEncodedFormEntity(formparams, UTF-8);httppost.setEntity(uefEntity);System.out.println(executing request + httppost.getURI();HttpResponse response;response = httpclient.execute(httppost);HttpEntity entity = response.getEntity();if (entity != null) System.out.println(-);System.out.println(Response content: + EntityUtils.toString(entity,UTF-8);System.out.println(-); catch (ClientProtocolException e) e.printStackTrace();catch(UnsupportedEncodingException e1) e1.printStackTrace();catch (IOException e) e.printStackTrace();finally /关闭连接,释放资源httpclient.getConnectionManager().shutdown();会将返回的jsp输出:executing request http:/localhost:8080/myDemo/Ajax/serivceJ.action-Response content: 测试页面hello:登录成功-f) HttpClient连接SSL1) 生成KeyStore打开cmd,输入(jdk环境变量当然是配置好的):keytool -genkey -alias tomcat -keyalg RSA validity 60 -keystore D:tomcat.keystorecmd输出:输入keystore密码:*您的名字与姓氏是什么?Unknown: localhost您的组织单位名称是什么?Unknown: it您的组织名称是什么?Unknown: dev您所在的城市或区域名称是什么?Unknown: bj您所在的州或省份名称是什么?Unknown: bj该单位的两字母国家代码是什么Unknown: CNCN=localhost, OU= it, O= dev, L=bj, ST=bj, C=CN 正确吗?否: Y输入的主密码(如果和 keystore 密码相同,按回车):*参数说明:-genkey表示生成密钥-validity指定证书有效期,这里是60天-alias指定别名,这里是tomcat-keyalg指定算法,这里是RSA-keystore指定存储位置,这里是D: tomcat.keystore使用的自定义密码为123456Keytool 详细命令说明请参考百度百科;*其中 您的名字与姓氏是什么? localhost是网站的域名或者ip,根据实际情况填写。否者会出现证书上的名称无效;2) 配置tomcat服务器支持SSL将生成的 tomcat.keystore文件,放到%TOMCAT_HOME%/conf目录中(其他也OK).说明: 修改%TOMCAT_HOME%/conf/server.xml,新增Connector(原注释里有):Code: 这样你的tomcat就支持https访问了;属性说明(来源网上资源): port: 这个port属性(默认值是8443)是 TCP/IP端口数码,Tomcat在其上监听安全连接。你可以把它更改成任何你愿意要的数值(如默认的https通信,数目是443)。不过,在许多操作系统中,要想在比1024小的端口数码上运行Tomcat,需要特殊的设置(它超出了这个文档资料的范围)。redirectPort: 如果你在这里更改端口数值,你还必须更改在non-SSL连接器上的redirectPort 这个属性特定的值。这允许Tomcat自动地redirect那些试图访问有安全限制页面的用户,指明根据 Servlet 2.4 Specification要求,SSL是必需的clientAuth: 如果你想要Tomcat要求所有的SSL客户在使用这个socket时出示用户认证书,把这个值设定为 true 。如果你想要Tomcat要求出示用户认证书,但是如果没有认证书也可以, 就把这个值设定为want 。keystoreFile: 如果你产生的keystore文件不在Tomcat期望的默认地方(一个叫做.keystore 的文件在Tomcat运行的主目录),就添加这个属性。你可以指定一个绝对路径名称, 或者一个由$CATALINA_BASE环境变量而派生的相对路径名称。keystorePass: 如果你使用一个不同的keystore(以及认证书)密码,而不是Tomcat期望的密码 (就是changeit),添加这个元素。keystoreType: 如果使用一个PKCS12 keystore的话,就添加这个element。 有效的值是JKS 和 PKCS12sslProtocol: 要在这个socket上被使用的加密解密协定。如果你在使用Sun的JVM,我们不提倡更改 这个值。据报道,TLS协定的IBMs 1.4.1 实现与一些通用的浏览器不兼容。 如果是这样,就使用value SSL ciphers: 这个socket允许使用的由逗号分隔开的加密密码列单。默认的情况下,任何可用的密码都允许被使用。algorithm: 可用的X509算法。默认是Sun的实现( SunX509 )。 对于IBM JVMs,你应该使用值 IbmX509。对于其他卖主,查阅JVM文档资料来 找正确的值。truststoreFile: 用来验证用户认证书的TrustStore文件。truststorePass: 访问TrustStore的密码。默认值就是keystorePass的值。truststoreType: 如果你在使用与KeyStore不同格式的TrustStore,添加这个元素。 合法的值是JKS和PKCS12keyAlias: 如果 keystore 里面有多个 key,你可以为用这个选项为加入的 key 起一个名字。 如果没有指定名字,使用时 keystore 内的第一个 key 将会被使用3) 用浏览器访问你的应用输入:https:/localhost:8443/myDemo你会发现: 你的应用已经处于SLL安全通道中了.4) 用httpClient访问https说明: 利用官方的一个例子来说明:Code: httpClientCode:public class ClientCustomSSL public final static void main(String args) throws Exception DefaultHttpClient httpclient = new DefaultHttpClient(); try KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType(); FileInputStream instream = new FileInputStream(new File(d:tomcat.keystore); try /加载keyStore d:tomcat.keystore trustStore.load(instream, 123456.toCharArray(); finally try instream.close(); catch (Exception ignore) /穿件Socket工厂,将trustStore注入 SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);/创建Scheme Scheme sch = new Scheme(https, 8443, socketFactory); /注册Scheme httpclient.getConnectionManager().getSchemeRegistry().register(sch); /创建http请求(get方式) HttpGet httpget = new HttpGet(https:/localhost:8443/myDemo/Ajax/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 脱碳路径模拟研究-洞察及研究
- 航运智能航运-洞察及研究
- 晕眩鉴别诊断-洞察及研究
- 并购财务绩效分析-洞察及研究
- 消防工程承包合同
- 商品房预售合同协议书范本
- 精神疾病神经遗传-洞察及研究
- 跨平台进程迁移中的错误检测与恢复机制-洞察及研究
- 营养成分稳定性研究-洞察及研究
- 管廊防水技术标准-洞察及研究
- 医院腹腔镜手术知情同意书
- p型半导体和n型半导体课件
- GB/T 748-2005抗硫酸盐硅酸盐水泥
- GB/T 28287-2012足部防护鞋防滑性测试方法
- 芜湖宜盛置业发展有限公司招聘3名编外工作人员(必考题)模拟卷
- 走好群众路线-做好群众工作(黄相怀)课件
- 混凝土结构设计原理教学教案
- 民间文学(全套课件)
- 专升本00465心理卫生与心理辅导历年试题题库(考试必备)
- 既有重载铁路无缝线路改造及运维技术探索
- 2022年教师副高职称评答辩范文(七篇)
评论
0/150
提交评论