使用AXIS2,能够方便的构建WebService的server端,也能够非常方便的作为Cilent,来訪问别的WebService。

以下依据工作中的经历,整理了一下,作为Cilent訪问WebService的要点。

依据Axis2的官方文档。Client的DataBinding方式有3种,最简单的好像是ADB。那么我就选用的ADB。

1.普通方式(http 不通过proxy,对方也没有利用SSL)

  1. // Generate Client
  2. RPCServiceClient serviceClient = new RPCServiceClient();
  3. Options options = serviceClient.getOptions();
  4.  
  5. // Generate Endpoint
  6. String webserviceurl = "http://www.abc.net/webservice/servicepage"; // for example.
  7. EndpointReference targetEPR = new EndpointReference(webserviceurl);
  8.  
  9. options.setTo(targetEPR);
  10.  
  11. // Auto release transport.
  12. options.setCallTransportCleanup(true);
  13.  
  14. // Generate Action
  15. String ns = "http://www.abc.net/webservice";
  16. String action = "getSomething";
  17. QName opAction = new QName(ns, action);
  18.  
  19. // Generate Reqest parameters
  20. ReqBean reqObj = new ReqBean();
  21. reqObj.setParam1("param1");
  22. reqObj.setParam2("param2");
  23.  
  24. Object[] opArgs = new Object[] { reqObj };
  25. Class[] returnTypes = new Class[] { ArrayList.class };
  26.  
  27. Object[] response = null;
  28.  
  29. try {
  30. response = serviceClient.invokeBlocking(opAction, opArgs, returnTypes);
  31. } catch (AxisFault af) {
  32. // Process exception.
  33. }
  34.  
  35. ArrayList res = (ArrayList) response[0];
  36.  
  37. // Analyze the response.
  38. // ...

当中,ReqBean是依据所訪问的WebService须要的parameter,能够依据wsdl生成java的Bean类。

返回的Response,统一先转换为ArrayList,然后进一步解析为字符串或者各个Bean。

这是最简单的訪问方式。

2.通过SSL訪问。

(https)

大部分时候,client不会提前获得server的证书导致出错。所以须要自己更新一下通信的protocol。

官方站点上说的不甚具体。所以罗列一下代码。

2.1 生成一个新的协议工厂类:

  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.cert.CertificateException;
  8. import java.security.cert.X509Certificate;
  9.  
  10. import javax.net.SocketFactory;
  11. import javax.net.ssl.SSLContext;
  12. import javax.net.ssl.TrustManager;
  13. import javax.net.ssl.X509TrustManager;
  14.  
  15. import org.apache.commons.httpclient.ConnectTimeoutException;
  16. import org.apache.commons.httpclient.HttpClientError;
  17. import org.apache.commons.httpclient.params.HttpConnectionParams;
  18. import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
  19.  
  20. public class SSLIgnoreErrorProtocolSocketFactory implements
  21. ProtocolSocketFactory {
  22. private SSLContext sslcontext = null;
  23.  
  24. /**
  25. * 不进行证明书的验证
  26. *
  27. * @return
  28. */
  29. private static SSLContext createEasySSLContext() {
  30. try {
  31. SSLContext context = SSLContext.getInstance("SSL");
  32. context.init(null, new TrustManager[] { new X509TrustManager() {
  33. public void checkClientTrusted(X509Certificate[] arg0,
  34. String arg1) throws CertificateException {
  35. }
  36.  
  37. public void checkServerTrusted(X509Certificate[] arg0,
  38. String arg1) throws CertificateException {
  39. }
  40.  
  41. public X509Certificate[] getAcceptedIssuers() {
  42. return null;
  43. }
  44. } }, null);
  45. return context;
  46. } catch (Exception e) {
  47. throw new HttpClientError(e.toString());
  48. }
  49. }
  50.  
  51. private SSLContext getSSLContext() {
  52. if (this.sslcontext == null) {
  53. this.sslcontext = createEasySSLContext();
  54. }
  55. return this.sslcontext;
  56. }
  57.  
  58. @Override
  59. public Socket createSocket(String host, int port) throws IOException,
  60. UnknownHostException {
  61. return getSSLContext().getSocketFactory().createSocket(host, port);
  62. }
  63.  
  64. @Override
  65. public Socket createSocket(String host, int port, InetAddress clientHost,
  66. int clientPort) throws IOException, UnknownHostException {
  67. return getSSLContext().getSocketFactory().createSocket(host, port,
  68. clientHost, clientPort);
  69. }
  70.  
  71. @Override
  72. public Socket createSocket(String host, int port, InetAddress localAddress,
  73. int localPort, HttpConnectionParams params) throws IOException,
  74. UnknownHostException, ConnectTimeoutException {
  75. if (params == null) {
  76. throw new IllegalArgumentException("Parameters may not be null");
  77. }
  78. int timeout = params.getConnectionTimeout();
  79. SocketFactory socketfactory = getSSLContext().getSocketFactory();
  80. if (timeout == 0) {
  81. return socketfactory.createSocket(host, port, localAddress,
  82. localPort);
  83. } else {
  84. Socket socket = socketfactory.createSocket();
  85. SocketAddress localaddr = new InetSocketAddress(localAddress,
  86. localPort);
  87. SocketAddress remoteaddr = new InetSocketAddress(host, port);
  88. socket.bind(localaddr);
  89. socket.connect(remoteaddr, timeout);
  90. return socket;
  91. }
  92. }
  93.  
  94. }

2.2 利用上面的类。做成一个新的协议对象。(sslport依据server端的设定而指定。通常是443.)

  1. Protocol protocol = null;
  2. SSLIgnoreErrorProtocolSocketFactory socketfactory = null;
  3.  
  4. socketfactory = new SSLIgnoreErrorProtocolSocketFactory();
  5.  
  6. protocol = new Protocol("https", socketfactory, sslport);

2.3 把上面做成的protocol对象设定给RPCServiceClient的options。

  1. options.setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, protocol);

然后。就能够通过https来訪问WebService了。

注意:HTTPConstants是利用的org.apache.axis2.transport.http.HTTPConstants类。

3. 须要通过代理server的情况。

这个依照官方站点的来就能够了。

3.1 生成代理属性:

  1. HttpTransportProperties.ProxyProperties proxyProperties = new HttpTransportProperties.ProxyProperties();
  2. proxyProperties.setProxyName(proxy_server);
  3. proxyProperties.setProxyPort((int) (proxy_port);

HttpTransportProperties是利用的org.apache.axis2.transport.http.HttpTransportProperties

3.2 把代理属性设定给RPCServiceClient的options。

  1. options.setProperty(HTTPConstants.PROXY, proxyProperties);

就能够通过代理server来訪问了。

注意,使用代理服务期的注意事项:

实际工作中,我利用squid測试的时候,发现通信时,axis2默认使用chunked属性,导致不能通过squid,详细原因不明。

于是。当时用squid的时候,把chunked属性disable掉了。

  1. options.setProperty(HTTPConstants.CHUNKED, false);

这一点。官网上没有提及,也可能是我哪里设定的不够。

以上,就是通过Axis2作为client訪问WebService的几种情况,基本上一般的http环境差点儿相同应该都能对付了。

当然,还有其它的通信方式。临时在工作中没实用到。

使用AXIS2作为Client訪问WebService的更多相关文章

  1. jquery ajax CORS 跨域訪问 WebService

    JS代码: var word = document.getElementById("word").value; $.ajax({ type: "POST", c ...

  2. python 訪问webservice

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  3. Nginx 訪问日志增长暴增出现尖刀的具体分析

    前言:          Nginx日志里面Mobileweb_access.log增长特别大.一天上百兆.将近100W的訪问记录.依照我们眼下的规模,热点用户才500个左右.就算人人用手机app訪问 ...

  4. JBoss DataGrid的集群部署与訪问

    集群部署 JDG的缓存模式包含本地(Local)模式和集群(Clustered)模式.本项目採用多节点的Clustered模式部署.数据在多个节点的子集间进行复制.而不是同步拷贝到全部的节点. 使用子 ...

  5. JAVA设计模式之 訪问者模式【Visitor Pattern】

    一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...

  6. Cassandra数据库Java訪问

    针对的时Cassandra 2.0 数据库 Java本地client訪问Cassandra,首先建立Javaproject,使用Maven进行管理. 引入依赖: <dependency> ...

  7. windows下通过VNC图形化訪问Ubuntu桌面环境

    要在windows下图形化訪问Ubuntu或其他Linux系统桌面环境有非常多方法.我比較喜欢的是使用VNC服务,须要在Ubuntu下安装vncserver和在windows下安装client訪问工具 ...

  8. 通过Nginx訪问FastDFS文件系统并进行图片文件裁剪的性能測试和分析

    前段时间公司的分布式图片文件系统(FastDFS)做了图片裁剪和缩放功能,并把缩放计算和FastDFS做了解耦分离,前端用虚拟机作为图片文件缩放的訪问代理层(Nginx Proxy),后端使用ngin ...

  9. Web.config中设置启用webservice远程调试訪问

    在.NET 中已经默认将webservice的远程调试功能关闭.有的时候我们须要远程调试程序的时候,就须要打开此功能我们仅仅需在webservice的项目的中添web.config的<syste ...

随机推荐

  1. Loj #6164. 「美团 CodeM 初赛 Round A」数列互质

    link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...

  2. python正则表达式从路径中取文件名出来不加后缀(txt)

    正则表达式[^\\/:*?"<>|\r\n]+$ ---->取文件名包括后缀 e.g. >>>D:\PyCharm 2018.2.4\pythonWork ...

  3. 串口调试利器--Minicom配置及使用详解.md

    因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择.目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB*. Minicom,是Linux下应用比较广泛的串口软 ...

  4. Android requestLayout 和 invalidata , postInvalidate 比较

    Android 中的View更新方法 invalidate 在UI线程中使用. postInvalidate 在非UI线程中通知重绘. View 确定自身已经不适合现有区域时,调用requestLay ...

  5. Linux下防火墙iptables用法规则详及其防火墙配置

    转:http://www.linuxidc.com/Linux/2012-08/67952.htm iptables规则 规则--顾名思义就是规矩和原则,和现实生活中的事情是一样的,国有国法,家有家规 ...

  6. VIM正则表达式查找替换

      0. 一些需要注意的不同 VIM中的正则表达式和其他的有点不一样 (1) 有些符号要用\转义,比如\+表示重复一次或以上,其他的还有一些,:h pattern查看(2) 非贪婪匹配用\{-}, 如 ...

  7. AngularJS中选择样式

    代码下载:https://files.cnblogs.com/files/xiandedanteng/angularJSSelectClass.rar 要点,{{ctrl.name}}比<spa ...

  8. Win7如何自定义鼠标右键菜单 添加新建文本文档

    鼠标右键新建文本文档.reg REGEDIT4 [HKEY_CLASSES_ROOT\.txt] @="txtfile" "Content Type"=&quo ...

  9. mongoDb学习以及spring管理 (包括百度云配置)

    1.windows下的安装http://www.cnblogs.com/liuzhiying/p/5915741.html 2.慕课网学习单机操作mongoDb 赋权限:http://blog.csd ...

  10. tyvj-1460 旅行

    题目描写叙述: A国有n座城市,每座城市都十分美,这使得A国的民众们很喜欢旅行. 然而,A国的交通十分落后,这里仅仅有m条双向的道路.而且这些道路都十分崎岖,有的甚至还是山路.仅仅能靠步行.通过每条道 ...