打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
HttpClient详细实例,Httoclient调用https实例,避免https SSL认证

   最近公司将原有的http协议接口,更改为了可支持https的双向接口,在查阅资料同时,将解决过程与大家分享。

使用的框架是Struts2,如有变动可自行修改相应代码。


首先,我们看看httpClient是个什么东西,它有什么作用,它能干嘛,它地基本用法?

百度介绍:http://baike.baidu.com/link?url=_gKuBTJc3HqNGmSEoXyVwW0mlUE2joDRWH8SbFzp0KvppAn63bFrNTzJEQkWVbLXQlAb-ermhwoLBORmnH_1Ta

基本使用详情①(转载):http://blog.csdn.net/wangpeng047/article/details/19624529

基本使用详情②(转载):http://blog.csdn.net/5iasp/article/details/8638800  

--以上 基本可以让你对httpClient有个基本了解,也可以有个基本的使用。

httpClient是一个用于调用http协议的插件,要使用此插件需使用以下jar包:

commons-beanutils-1.8.0.jar
commons-codec.jar
commons-collections-3.2.jar
commons-lang-2.4.jar
commons-lang3-3.1.jar
commons-logging-1.1.1.jar
ezmorph-1.0.4.jar
httpclient-4.1.3.jar
httpclient-cache-4.1.3.jar
httpcore-4.1.4.jar
httpmime-4.1.3.jar
json-lib-2.4-jdk15.jar

以上jar下载地址:

http://download.csdn.net/detail/dcb_ripple/9477012

简单的的httpClient 使用,

1.httpClient 简单使用HttpPost调用http接口


  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import org.apache.http.HttpResponse;
  4. import org.apache.http.NameValuePair;
  5. import org.apache.http.auth.AuthScope;
  6. import org.apache.http.auth.UsernamePasswordCredentials;
  7. import org.apache.http.client.CredentialsProvider;
  8. import org.apache.http.client.HttpClient;
  9. import org.apache.http.client.entity.UrlEncodedFormEntity;
  10. import org.apache.http.client.methods.HttpPost;
  11. import org.apache.http.entity.StringEntity;
  12. import org.apache.http.impl.client.BasicCredentialsProvider;
  13. import org.apache.http.impl.client.DefaultHttpClient;
  14. import org.apache.http.message.BasicNameValuePair;
  15. import org.apache.http.util.EntityUtils;
  16. /**
  17. * 使用httpPost http登陆接口(无http摘要认证)
  18. */
  19. public static void testHttpClient(){
  20. //1.创建httpClient对象 (使用https协议,需要略过ssl验证,这里使用MySSLSocketFactory)
  21. HttpClient httpclient = new DefaultHttpClient();
  22. //url https地址
  23. String url ="http://192.168.10.215:8080/tnserver/property_manager/login";
  24. try {
  25. //2.创建列参数(httpPost使用)
  26. HttpPost httppost = new HttpPost(url);
  27. List<NameValuePair> list = new ArrayList<NameValuePair>();
  28. //将用户名与密码作为参数写入(username,password这两个参数是 根据你的接口协议而定)
  29. list.add(new BasicNameValuePair("username","admin"));
  30. list.add(new BasicNameValuePair("password","123456"));
  31. //3.写入请求头
  32. httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
  33. //4.将参数写入到httpost中,并设置编码格式为UTF-8
  34. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,"UTF-8");
  35. httppost.setEntity(entity);
  36. //5.执行
  37. HttpResponse post= httpclient.execute(httppost);
  38. //6.执行完毕,判断返回code码,200为正常
  39. if (post.getStatusLine().getStatusCode() == 200) {
  40. //7.获取返回json格式数据 注意,这里不能直接转java.lang.String进行强转,
  41. String conResult = EntityUtils.toString(post.getEntity());
  42. //8.处理返回数据....(完)
  43. JSONObject sobj = new JSONObject();
  44. sobj = JSONObject.fromObject(conResult);
  45. System.out.println(sobj);
  46. } else {
  47. System.out.println("失败....");
  48. }
  49. }catch(Exception e){
  50. e.printStackTrace();
  51. }
  52. }

</pre><p></p><pre>
以上这个例子很中规中矩,没有太多特殊处理的地方。

那如果想象一下,要传入的参数是一个JSON格式的数据呢?

例如在登陆时将用户名与密码已json格式传入,

格式如下:

{

"username":"admin",

"password":"admin"

}

====那这个时候如果再采用

List<NameValuePair> list = new ArrayList<NameValuePair>();list.add(new BasicNameValuePair("username","xxxx"));list.add(new BasicNameValuePair("password","xxxxx"));

的方式传参肯定是有问题的,因为它采用key/value的方式传值方式,与action中   ”getRequest().getParameter(“xxx”)  “ 是一个道理

那么这个时候该怎么进行参数的传递呢?--看下面

2.httpClient 简单使用HttpPost 参数类型为JSON格式时

  1. /**
  2. * 使用httpPost 参数为JSON格式时(无http摘要认证)
  3. */
  4. public static void testHttpClient1(){
  5. HttpClient httpclient = new DefaultHttpClient();
  6. String url ="http://192.168.10.215:8080/tnserver/property_manager/login";
  7. try {
  8. HttpPost httppost = new HttpPost(url);
  9. httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
  10. //此处略有不同的是,它是直接将JSON格式数据写如到httppost.setEntity实体中
  11. //并采用了StringEntity工具类,来进行转换。。。。
  12. JSONObject json = new JSONObject();
  13. json.put("username", "admin@qq.com");
  14. json.put("password", "123456");
  15. StringEntity entity = new StringEntity(json.toString(),"UTF-8");
  16. httppost.setEntity(entity);
  17. HttpResponse post= httpclient.execute(httppost);
  18. if (post.getStatusLine().getStatusCode() == 200) {
  19. String conResult = EntityUtils.toString(post.getEntity());
  20. JSONObject sobj = new JSONObject();
  21. sobj = JSONObject.fromObject(conResult);
  22. System.out.println(sobj);
  23. } else {
  24. System.out.println("失败....");
  25. }
  26. }catch(Exception e){
  27. e.printStackTrace();
  28. }finally{
  29. }
  30. }

通过上面StringEntity entity 类的处理就可以实现传输JSON格式参数了。

是不是很简单,快试一试就知道了,上面的代码只需要Copy到自己的Main方法中就可以测试。。。。。  

不过要注意测试之前请先弄清楚你的htpp接口根据接口进行相应更改

===========================================================

以上两个例子只可基于http协议,且服务器中没有设置身份认证的情况下。。。

服务器中有账户认证处理

具体如下:

  1. public static void testHttpClient2(){
  2. HttpClient httpclient = new DefaultHttpClient();
  3. String url ="http://xxxxx:xxxxx/tnserver/property_manager/login";
  4. try {
  5. HttpPost httppost = new HttpPost(url);
  6. //==========http认证过程===================== 如无需采用https协议进行调用,可忽略https认证过程
  7. //注:此方法只用于import org.apache.http.client.HttpClient; 新版本的认证
  8. //旧版本:import org.apache.commons.httpclient 认证方法如下:
  9. //Credentials defaultcreds = new UsernamePasswordCredentials("userxxx","pwdxxx");
  10. //httpClient.getState().setCredentials(AuthScope.ANY, defaultcreds);
  11. //注意。 旧版本的认证方式导入的包是 带 org.apache.commons.xxxx
  12. //创建https认证对象
  13. CredentialsProvider credsProvider = new BasicCredentialsProvider();
  14. //写入认证的用户名与密码
  15. UsernamePasswordCredentials creds = new UsernamePasswordCredentials("xxx", "xxx");
  16. //创建验证
  17. credsProvider.setCredentials(
  18. new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
  19. creds);
  20. //将认证写入到httpClient中
  21. ((DefaultHttpClient)httpclient).setCredentialsProvider(credsProvider);
  22. //=========Https认证===end=============================
  23. httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
  24. JSONObject json = new JSONObject();
  25. json.put("username", "xxxx");
  26. json.put("password", "xxxxx");
  27. StringEntity entity = new StringEntity(json.toString());
  28. httppost.setEntity(entity);
  29. HttpResponse post= httpclient.execute(httppost);
  30. if (post.getStatusLine().getStatusCode() == 200) {
  31. String conResult = EntityUtils.toString(post.getEntity());
  32. JSONObject sobj = new JSONObject();
  33. sobj = JSONObject.fromObject(conResult);
  34. System.out.println(sobj);
  35. } else {
  36. System.out.println("失败....");
  37. }
  38. }catch(Exception e){
  39. e.printStackTrace();
  40. }finally{
  41. }
  42. }
这个认证账户密码是在http服务器中设置,所以别说不知账户密码是什么,直接问接口提供方。
前提是对方告诉你这是一个基于http协议的接口,并且会有认证过程。


好,上面说了又一种旧版本的认证方式,这里直接附上 (注意这里的调用方式不一样,旧版本没有httpPost 而是PostMethod。。详情请百度。

http://www.cnblogs.com/davidwang456/p/4062233.html


HTTPS如果略过证书认证过程

那又如果使用是基于HTTPS的呢? 

HTTPS与HTTP有很大区别,它相比HTTP协议更安全,更高效。

HTTP与HTTP区别:http://blog.csdn.net/angussl/article/details/5557738

-正题:如何在调用时略过HTTPS 证书SSL认证过程

在调用https协议的的接口时都会遇到一个问题,那就是SSL证书怎么破,难道真的在本地安装?貌似有点不好弄,说实话我也不会.....

所以我们肯定是希望有这么一个东西,那就是可以在使用的时候忽略SSL认证的问题,那么这样我们就不必为SSL而苦恼。


代码:

  1. package com.httpclicent;
  2. import java.io.IOException;
  3. import java.net.Socket;
  4. import java.net.UnknownHostException;
  5. import java.security.KeyManagementException;
  6. import java.security.KeyStore;
  7. import java.security.KeyStoreException;
  8. import java.security.NoSuchAlgorithmException;
  9. import java.security.UnrecoverableKeyException;
  10. import java.security.cert.CertificateException;
  11. import java.security.cert.X509Certificate;
  12. import javax.net.ssl.SSLContext;
  13. import javax.net.ssl.TrustManager;
  14. import javax.net.ssl.X509TrustManager;
  15. import org.apache.http.HttpVersion;
  16. import org.apache.http.client.HttpClient;
  17. import org.apache.http.conn.ClientConnectionManager;
  18. import org.apache.http.conn.scheme.PlainSocketFactory;
  19. import org.apache.http.conn.scheme.Scheme;
  20. import org.apache.http.conn.scheme.SchemeRegistry;
  21. import org.apache.http.conn.ssl.SSLSocketFactory;
  22. import org.apache.http.impl.client.DefaultHttpClient;
  23. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
  24. import org.apache.http.params.BasicHttpParams;
  25. import org.apache.http.params.HttpParams;
  26. import org.apache.http.params.HttpProtocolParams;
  27. import org.apache.http.protocol.HTTP;
  28. /**
  29. * https SSL证书避免认证问题 (注意此处同样是新版本的SSL避免方式)
  30. * @author yzs
  31. *
  32. */
  33. public class MySSLSocketFactory extends SSLSocketFactory {
  34. SSLContext sslContext = SSLContext.getInstance("TLS");
  35. /**
  36. *
  37. * @param truststore
  38. * @throws NoSuchAlgorithmException
  39. * @throws KeyManagementException
  40. * @throws KeyStoreException
  41. * @throws UnrecoverableKeyException
  42. */
  43. public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
  44. super(truststore);
  45. TrustManager tm = new X509TrustManager() {
  46. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  47. }
  48. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  49. }
  50. public X509Certificate[] getAcceptedIssuers() {
  51. return null;
  52. }
  53. };
  54. sslContext.init(null, new TrustManager[] { tm }, null);
  55. }
  56. @Override
  57. public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
  58. return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
  59. }
  60. @Override
  61. public Socket createSocket() throws IOException {
  62. return sslContext.getSocketFactory().createSocket();
  63. }
  64. /**
  65. * 在使用时直接调用它即可,,,, 直接得略过https的ssl验证过程
  66. * @return
  67. */
  68. public static HttpClient getNewHttpClient() {
  69. try {
  70. KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
  71. trustStore.load(null, null);
  72. SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
  73. sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  74. HttpParams params = new BasicHttpParams();
  75. HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  76. HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
  77. SchemeRegistry registry = new SchemeRegistry();
  78. registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
  79. registry.register(new Scheme("https", sf, 443));
  80. ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
  81. return new DefaultHttpClient(ccm, params);
  82. } catch (Exception e) {
  83. return new DefaultHttpClient();
  84. }
  85. }
  86. }

=============================说明:此类是从别处找到,并非自己写出来的

有了这个Class一切都将不是问题,无需太大改动,只需要在创建HttpClicent时 使用 类中的getNewHttpClient即可

如下:

//1.创建httpClient对象 (使用https协议,需要略过ssl验证,这里使用MySSLSocketFactory)

HttpClient httpclient = MySSLSocketFactory.getNewHttpClient();


代码:


  1. public static void testHttpClient3(){
  2. //1.创建httpClient对象 (使用https协议,需要略过ssl验证,这里使用MySSLSocketFactory)
  3. HttpClient httpclient = MySSLSocketFactory.getNewHttpClient();
  4. <span style="white-space:pre"> </span>//http默认端口号是80 https为443
  5. String url ="http://xxxx:443/tnserver/property_manager/login";
  6. try {
  7. HttpPost httppost = new HttpPost(url);
  8. //==========https认证过程===================== 如无需采用https协议进行调用,客户了https认证过程
  9. //注:此方法只用于import org.apache.http.client.HttpClient; 新版本的认证
  10. //创建https认证对象
  11. CredentialsProvider credsProvider = new BasicCredentialsProvider();
  12. //写入认证的用户名与密码
  13. UsernamePasswordCredentials creds = new UsernamePasswordCredentials("xxx", "xxx");
  14. //创建验证
  15. credsProvider.setCredentials(
  16. new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
  17. creds);
  18. //将认证写入到httpClient中
  19. ((DefaultHttpClient)httpclient).setCredentialsProvider(credsProvider);
  20. //=========Https认证===end=============================
  21. httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
  22. JSONObject json = new JSONObject();
  23. json.put("username", "xxx");
  24. json.put("password", "xxx");
  25. StringEntity entity = new StringEntity(json.toString());
  26. httppost.setEntity(entity);
  27. HttpResponse post= httpclient.execute(httppost);
  28. if (post.getStatusLine().getStatusCode() == 200) {
  29. String conResult = EntityUtils.toString(post.getEntity());
  30. JSONObject sobj = new JSONObject();
  31. sobj = JSONObject.fromObject(conResult);
  32. System.out.println(sobj);
  33. } else {
  34. System.out.println("失败....");
  35. }
  36. }catch(Exception e){
  37. e.printStackTrace();
  38. }finally{
  39. }
  40. }


ok,有以上代码基本可以实现大部分http与https接口的调用了。。。。

附上一个自己项目中实际使用的实例

需求:



代码实现Action:

  1. package cn.thinknet.action;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.http.HttpResponse;
  5. import org.apache.http.NameValuePair;
  6. import org.apache.http.auth.AuthScope;
  7. import org.apache.http.auth.UsernamePasswordCredentials;
  8. import org.apache.http.client.CredentialsProvider;
  9. import org.apache.http.client.HttpClient;
  10. import org.apache.http.client.entity.UrlEncodedFormEntity;
  11. import org.apache.http.client.methods.HttpPost;
  12. import org.apache.http.impl.client.BasicCredentialsProvider;
  13. import org.apache.http.impl.client.DefaultHttpClient;
  14. import org.apache.http.message.BasicNameValuePair;
  15. import org.apache.http.util.EntityUtils;
  16. import net.sf.json.JSONArray;
  17. import net.sf.json.JSONObject;
  18. import cn.thinknet.bean.UserManage;
  19. import cn.thinknet.util.MySSLSocketFactory;
  20. public class UserManageAction extends BaseAction{
  21. private String msg;
  22. private List<UserManage> userManageList;
  23. private JSONArray resultJa;
  24. private String ids;
  25. private JSONObject result;
  26. private UserManage userManage;
  27. public String login(){
  28. //1.创建httpClient对象 (使用https协议,需要略过ssl验证,这里使用MySSLSocketFactory)
  29. //注:如无需使用https协议进行调用,则代码创建处理如下
  30. // HttpClient httpclient1 = new DefaultHttpClient();
  31. HttpClient httpclient = MySSLSocketFactory.getNewHttpClient();
  32. //url https地址
  33. String url ="https://192.168.10.216:443/tnserver/property_manager/login";
  34. try {
  35. //2.创建列参数(httpPost使用)
  36. List<NameValuePair> list = new ArrayList<NameValuePair>();
  37. //将用户名与密码作为参数写入(username,password这两个参数是 根据你的接口协议而定)
  38. list.add(new BasicNameValuePair("username","admin@163.com"));
  39. list.add(new BasicNameValuePair("password","123456"));
  40. //3.创建http对象
  41. HttpPost httppost = new HttpPost(url);
  42. //==========https认证过程===================== 如无需采用https协议进行调用,客户了https认证过程
  43. //注:此方法只用于import org.apache.http.client.HttpClient; 新版本的认证
  44. //旧版本:import org.apache.commons.httpclient 认证方法如下:
  45. //Credentials defaultcreds = new UsernamePasswordCredentials("userxxx","pwdxxx");
  46. //httpClient.getState().setCredentials(AuthScope.ANY, defaultcreds);
  47. //注意。 旧版本的认证方式导入的包是 带 org.apache.commons.xxxx
  48. //创建https认证对象
  49. CredentialsProvider credsProvider = new BasicCredentialsProvider();
  50. //写入认证的用户名与密码
  51. UsernamePasswordCredentials creds = new UsernamePasswordCredentials("admin", "123");
  52. //创建验证
  53. credsProvider.setCredentials(
  54. new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
  55. creds);
  56. //将认证写入到httpClient中
  57. ((DefaultHttpClient)httpclient).setCredentialsProvider(credsProvider);
  58. //============end=============================
  59. httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
  60. //4.将参数写入到httpost中,并设置编码格式为UTF-8
  61. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,"UTF-8");
  62. httppost.setEntity(entity);
  63. //5.执行
  64. HttpResponse post= httpclient.execute(httppost);
  65. //6.执行完毕,判断返回code码,200为正常
  66. if (post.getStatusLine().getStatusCode() == 200) {
  67. //7.获取返回json格式数据 注意,这里不能直接转java.lang.String进行强转,
  68. String conResult = EntityUtils.toString(post.getEntity());
  69. //8.处理返回数据....(完)
  70. JSONObject sobj = new JSONObject();
  71. sobj = JSONObject.fromObject(conResult);
  72. System.out.println(sobj);
  73. } else {
  74. System.out.println("失败....");
  75. }
  76. }catch(Exception e){
  77. e.printStackTrace();
  78. }finally{
  79. }
  80. return "success1";
  81. }
  82. public String getMsg() {
  83. return msg;
  84. }
  85. public void setMsg(String msg) {
  86. this.msg = msg;
  87. }
  88. public JSONArray getResultJa() {
  89. return resultJa;
  90. }
  91. public void setResultJa(JSONArray resultJa) {
  92. this.resultJa = resultJa;
  93. }
  94. public JSONObject getResult() {
  95. return result;
  96. }
  97. public void setResult(JSONObject result) {
  98. this.result = result;
  99. }
  100. public String getIds() {
  101. return ids;
  102. }
  103. public void setIds(String ids) {
  104. this.ids = ids;
  105. }
  106. public UserManage getUserManage() {
  107. return userManage;
  108. }
  109. public void setUserManage(UserManage userManage) {
  110. this.userManage = userManage;
  111. }
  112. public List<UserManage> getUserManageList() {
  113. return userManageList;
  114. }
  115. public void setUserManageList(List<UserManage> userManageList) {
  116. this.userManageList = userManageList;
  117. }
  118. }

返回结果:



======




完成!!! 没了,就这么多啦~~~

本人目前也是属于java两年新人,勿喷~~

最后附上简单Dome:

http://download.csdn.net/detail/dcb_ripple/9477041



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java接入钉钉机器人实现告警通知
java 发送微信客服消息
微信支付v3——批量转账到零钱(提现)
spring集成httpclient连接池配置
JAVA利用HttpClient进行POST请求(HTTPS)
一些门户或平台网站的数据获取与分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服