资讯专栏INFORMATION COLUMN

使用commons httpclient请求https协议的webservice

VPointer / 2169人阅读

摘要:使支持协议类,是自定义私有类请求类根据请求报文,请求服务地址获取响应报文请求报文请求地址字符集类型封装的服务器响应参数和返回报文正常响应。

使commons httpclient支持https协议类,是commons httpclient

</>复制代码

  1. import java.io.IOException;
  2. import java.net.InetAddress;
  3. import java.net.InetSocketAddress;
  4. import java.net.Socket;
  5. import java.net.SocketAddress;
  6. import java.net.UnknownHostException;
  7. import java.security.KeyManagementException;
  8. import java.security.NoSuchAlgorithmException;
  9. import java.security.cert.CertificateException;
  10. import java.security.cert.X509Certificate;
  11. import javax.net.SocketFactory;
  12. import javax.net.ssl.SSLContext;
  13. import javax.net.ssl.TrustManager;
  14. import javax.net.ssl.X509TrustManager;
  15. import org.apache.commons.httpclient.ConnectTimeoutException;
  16. import org.apache.commons.httpclient.params.HttpConnectionParams;
  17. import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
  18. /**
  19. * httpclient https
  20. *
  21. */
  22. public class HTTPSSecureProtocolSocketFactory implements ProtocolSocketFactory {//SecureProtocolSocketFactory
  23. private SSLContext sslcontext = null;
  24. private SSLContext createSSLContext()
  25. {
  26. SSLContext sslcontext = null;
  27. try
  28. {
  29. sslcontext = SSLContext.getInstance("SSL");
  30. sslcontext.init(null, new TrustManager[]
  31. { new TrustAnyTrustManager() }, new java.security.SecureRandom());
  32. }
  33. catch (NoSuchAlgorithmException e)
  34. {
  35. e.printStackTrace();
  36. }
  37. catch (KeyManagementException e)
  38. {
  39. e.printStackTrace();
  40. }
  41. return sslcontext;
  42. }
  43. private SSLContext getSSLContext()
  44. {
  45. if (this.sslcontext == null)
  46. {
  47. this.sslcontext = createSSLContext();
  48. }
  49. return this.sslcontext;
  50. }
  51. public Socket createSocket(Socket socket, String host, int port,
  52. boolean autoClose) throws IOException, UnknownHostException
  53. {
  54. return getSSLContext().getSocketFactory().createSocket(socket, host,
  55. port, autoClose);
  56. }
  57. public Socket createSocket(String host, int port) throws IOException,
  58. UnknownHostException
  59. {
  60. return getSSLContext().getSocketFactory().createSocket(host, port);
  61. }
  62. public Socket createSocket(String host, int port, InetAddress clientHost,
  63. int clientPort) throws IOException, UnknownHostException
  64. {
  65. return getSSLContext().getSocketFactory().createSocket(host, port,
  66. clientHost, clientPort);
  67. }
  68. public Socket createSocket(String host, int port, InetAddress localAddress,
  69. int localPort, HttpConnectionParams params) throws IOException,
  70. UnknownHostException, ConnectTimeoutException
  71. {
  72. if (params == null)
  73. {
  74. throw new IllegalArgumentException("Parameters may not be null");
  75. }
  76. int timeout = params.getConnectionTimeout();
  77. SocketFactory socketfactory = getSSLContext().getSocketFactory();
  78. if (timeout == 0)
  79. {
  80. return socketfactory.createSocket(host, port, localAddress,
  81. localPort);
  82. }
  83. else
  84. {
  85. Socket socket = socketfactory.createSocket();
  86. SocketAddress localaddr = new InetSocketAddress(localAddress,
  87. localPort);
  88. SocketAddress remoteaddr = new InetSocketAddress(host, port);
  89. socket.bind(localaddr);
  90. socket.connect(remoteaddr, timeout);
  91. return socket;
  92. }
  93. }
  94. // 自定义私有类
  95. private static class TrustAnyTrustManager implements X509TrustManager
  96. {
  97. public void checkClientTrusted(X509Certificate[] chain, String authType)
  98. throws CertificateException
  99. {
  100. }
  101. public void checkServerTrusted(X509Certificate[] chain, String authType)
  102. throws CertificateException
  103. {
  104. }
  105. public X509Certificate[] getAcceptedIssuers()
  106. {
  107. return new X509Certificate[]
  108. {};
  109. }
  110. }
  111. }

httpclient请求类

</>复制代码

  1. import java.io.IOException;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.apache.commons.httpclient.HttpClient;
  5. import org.apache.commons.httpclient.UsernamePasswordCredentials;
  6. import org.apache.commons.httpclient.auth.AuthScope;
  7. import org.apache.commons.httpclient.methods.PostMethod;
  8. import org.apache.commons.httpclient.methods.StringRequestEntity;
  9. import org.apache.commons.httpclient.protocol.Protocol;
  10. public class SoapUtil {
  11. /**
  12. *

    Description: 根据请求报文,请求服务地址获取 响应报文

  13. * @param requestSoap 请求报文
  14. * @param serviceAddress 请求地址
  15. * @param charSet 字符集 utf-8
  16. * @param contentType 类型 text/xml; charset=utf-8
  17. * @return map封装的 服务器响应参数和返回报文.PS:statusCode :200正常响应。responseSoap:响应报文
  18. *

    thinking:

  19. *
  20. * @author
  21. */
  22. public static Map responseSoap(String requestSoap,String serviceAddress,String charSet, String contentType){
  23. String responseSoap="";
  24. Map resultmap=new HashMap();
  25. PostMethod postMethod = new PostMethod(serviceAddress);
  26. HttpClient httpClient = new HttpClient();
  27. Protocol myhttps = new Protocol("https", new HTTPSSecureProtocolSocketFactory(), 443);//支持https
  28. Protocol.registerProtocol("https", myhttps);
  29. int statusCode = 0;
  30. try {
  31. httpClient.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("USERNAME", "PASSWORD"));//设置用户名密码,如果不需要就忽略这一行
  32. StringRequestEntity entity = new StringRequestEntity(requestSoap,contentType,charSet);
  33. postMethod.setRequestEntity(entity);
  34. statusCode = httpClient.executeMethod(postMethod);
  35. resultmap.put("statusCode", statusCode);
  36. } catch (IOException e) {
  37. throw new RuntimeException("执行http请求失败", e);
  38. }
  39. if (statusCode == 200) {
  40. try {
  41. responseSoap = postMethod.getResponseBodyAsString();
  42. resultmap.put("responseSoap", responseSoap);
  43. } catch (IOException e) {
  44. throw new RuntimeException("获取请求返回报文失败", e);
  45. }
  46. } else {
  47. throw new RuntimeException("请求失败:" + statusCode);
  48. }
  49. return resultmap;
  50. }
  51. }

xml工具类

</>复制代码

  1. import java.io.IOException;
  2. import java.io.StringReader;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.jdom.Document;
  8. import org.jdom.Element;
  9. import org.jdom.JDOMException;
  10. import org.jdom.input.SAXBuilder;
  11. import org.xml.sax.InputSource;
  12. public class XmlUtil {
  13. /**
  14. *

    Description:将字符串类型的XML 转化成Docunent文档结构

  15. * @param parseStrXml 待转换的xml 字符串
  16. * @return Document
  17. *
  18. * @author
  19. * @throws JDOMException
  20. * @throws IOException
  21. */
  22. public static Document strXmlToDocument(String parseStrXml) throws JDOMException, IOException{
  23. StringReader read = new StringReader(parseStrXml);
  24. //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
  25. InputSource source = new InputSource(read);
  26. //创建一个新的SAXBuilder
  27. SAXBuilder sb = new SAXBuilder(); // 新建立构造器
  28. Document doc = null;
  29. try {
  30. doc = sb.build(source);
  31. } catch (JDOMException e) {
  32. throw e;
  33. } catch (IOException e) {
  34. throw e;
  35. }
  36. return doc;
  37. }
  38. /**
  39. *

    Description: 根据目标节点名获取值

  40. * @param doc 文档结构
  41. * @param finalNodeName 最终节点名
  42. * @return
  43. *
  44. * @author
  45. */
  46. public static String getValueByElementName(Document doc,String finalNodeName){
  47. Element root = doc.getRootElement();
  48. HashMap map=new HashMap();
  49. //调用getChildAllText方法。获取目标子节点的值
  50. getChildAllText(doc, root,map);
  51. String result=(String)map.get(finalNodeName);
  52. return result;
  53. }
  54. /**
  55. *

    Description: 递归获得子节点的值

  56. * @param doc 文档结构
  57. * @param e 节点元素
  58. * @param resultmap 递归将值压入map
  59. * @return
  60. *
  61. * @author
  62. */
  63. public static Map getChildAllText(Document doc, Element e,Map resultmap) {
  64. if (e != null) {
  65. if (e.getChildren() != null) // 如果存在子节点
  66. {
  67. List list = e.getChildren();
  68. for (Element el : list) // 循环输出
  69. {
  70. if (el.getChildren().size() > 0) // 如果子节点还存在子节点,则递归获取
  71. {
  72. getChildAllText(doc, el, resultmap);
  73. } else {
  74. resultmap.put(el.getName(), el.getTextTrim()); // 将叶子节点值压入map
  75. }
  76. }
  77. }
  78. }
  79. return resultmap;
  80. }
  81. /**
  82. * 获取某个节点下的所有子节点
  83. * @param doc
  84. * @param element
  85. * @return
  86. */
  87. public static List getChildToList(Document doc,String element){
  88. Element root = doc.getRootElement();
  89. Element e = root.getChild(element);
  90. if(e != null){ //判断要查找的节点是否存在根节点,
  91. return e.getChildren();//存在:返回节点下的所有子节点
  92. }else{
  93. return getChildToList(root, element);//不存在:进入递归查询
  94. }
  95. }
  96. /**
  97. * 递归查找节点
  98. * @param root
  99. * @param element
  100. * @return
  101. */
  102. private static List getChildToList(Element root,String element){
  103. List list = new ArrayList<>();
  104. List rootElements = root.getChildren();
  105. for (Element element2 : rootElements) {
  106. if(element2.getChild(element)!=null){
  107. return element2.getChild(element).getChildren();
  108. }else{
  109. list = getChildToList(element2, element);
  110. if(list.size() != 0)
  111. return list;
  112. }
  113. }
  114. return new ArrayList<>();
  115. }
  116. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67942.html

相关文章

  • 构建https协议webService使用httpClient接口访问

    摘要:组件版本信息使用自带的命令生成文件命令将拷贝到目录下配置的目录文件,在配置文件中新增配置将工程添加进并启动,使用访问和链接。原理后续进一步研究 1.组件版本信息apache-tomcat-7.0.75JDK 1.8.0_91 2.使用jdk自带的keytool命令生成keystore文件test.keystore命令:keytool -genkey -alias test123 -ke...

    Tony_Zby 评论0 收藏0
  • WebService就是这么简单

    摘要:它使用方式,接收和响应外部系统的某种请求。回顾我们在学习基础网络编程章节已经知道了这么一个连接了。使用指定名称的命名空间。名词简单对象访问协议作为一个基于语言的协议用于有网上传输数据。以的根元素出现。代理这么一个概念就更加清晰了。 WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧.... 问题一 如果我们的网站需要提供一个天气预报这样一个需求...

    SwordFly 评论0 收藏0
  • 互亿无线短信发送

    摘要:最近几天有机会到了一家科技公司,和里面的项目经理聊了一下后端技术,他对我的讲了一下需要会的一些基本技术,其中提到了验证短信发送,今天我就刚学习了验证短信发送信息,主要运用互亿无线短信平台进行发送直入主题。 最近几天有机会到了一家科技公司,和里面的项目经理聊了一下后端技术,他对我的讲了一下需要会的一些基本技术,其中提到了验证短信发送,今天我就刚学习了验证短信发送信息,主要运用互亿无线短信...

    DobbyKim 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<