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

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

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

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

// Generate Client
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions(); // Generate Endpoint
String webserviceurl = "http://www.abc.net/webservice/servicepage"; // for example.
EndpointReference targetEPR = new EndpointReference(webserviceurl); options.setTo(targetEPR); // Auto release transport.
options.setCallTransportCleanup(true); // Generate Action
String ns = "http://www.abc.net/webservice";
String action = "getSomething";
QName opAction = new QName(ns, action); // Generate Reqest parameters
ReqBean reqObj = new ReqBean();
reqObj.setParam1("param1");
reqObj.setParam2("param2"); Object[] opArgs = new Object[] { reqObj };
Class[] returnTypes = new Class[] { ArrayList.class }; Object[] response = null; try {
response = serviceClient.invokeBlocking(opAction, opArgs, returnTypes);
} catch (AxisFault af) {
// Process exception.
} ArrayList res = (ArrayList) response[0]; // Analyze the response.
// ...

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

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

这是最简单的訪问方式。

2.通过SSL訪问。

(https)

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

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

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

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpClientError;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; public class SSLIgnoreErrorProtocolSocketFactory implements
ProtocolSocketFactory {
private SSLContext sslcontext = null; /**
* 不进行证明书的验证
*
* @return
*/
private static SSLContext createEasySSLContext() {
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, new TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
} public void checkServerTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
} public X509Certificate[] getAcceptedIssuers() {
return null;
}
} }, null);
return context;
} catch (Exception e) {
throw new HttpClientError(e.toString());
}
} private SSLContext getSSLContext() {
if (this.sslcontext == null) {
this.sslcontext = createEasySSLContext();
}
return this.sslcontext;
} @Override
public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(host, port);
} @Override
public Socket createSocket(String host, int port, InetAddress clientHost,
int clientPort) throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(host, port,
clientHost, clientPort);
} @Override
public Socket createSocket(String host, int port, InetAddress localAddress,
int localPort, HttpConnectionParams params) throws IOException,
UnknownHostException, ConnectTimeoutException {
if (params == null) {
throw new IllegalArgumentException("Parameters may not be null");
}
int timeout = params.getConnectionTimeout();
SocketFactory socketfactory = getSSLContext().getSocketFactory();
if (timeout == 0) {
return socketfactory.createSocket(host, port, localAddress,
localPort);
} else {
Socket socket = socketfactory.createSocket();
SocketAddress localaddr = new InetSocketAddress(localAddress,
localPort);
SocketAddress remoteaddr = new InetSocketAddress(host, port);
socket.bind(localaddr);
socket.connect(remoteaddr, timeout);
return socket;
}
} }

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

Protocol protocol = null;
SSLIgnoreErrorProtocolSocketFactory socketfactory = null; socketfactory = new SSLIgnoreErrorProtocolSocketFactory(); protocol = new Protocol("https", socketfactory, sslport);

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

options.setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, protocol);

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

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

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

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

3.1 生成代理属性:

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

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

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

options.setProperty(HTTPConstants.PROXY, proxyProperties);

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

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

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

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

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. AbstractAdvisingBeanPostProcessor---spring aop 处理器

    开局一张图,我们先上张图 类的说明和继承关系/** * Base class for {@link BeanPostProcessor} implementations that apply a * ...

  2. 【转】又一次线上 OOM 排查经过

    又一次线上OOM排查经过 最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务经常超时.问题出现非常不稳定,经过两周的时候,终于又捕捉到了一次Full GC,于是联系运维做Heap Dum ...

  3. ylb: 触发器(Trigger)之Instead Of触发器 [注:没内容]

    ylbtech-SQL Server:SQL Server-触发器(Trigger)之Instead Of触发器 触发器(Trigger)之Instead Of触发器 [注:没内容]. ylb: 触发 ...

  4. 常用jar包之commons-digester使用

    常用jar包之commons-digester使用 学习了:https://blog.csdn.net/terryzero/article/details/4332257 注意了, digester. ...

  5. mysql 远程登陆不上

    当使用 TCP/IP 连接 mysql 时, 出现 : Can't connect to MySQL server on 'xxx.xxx.xxx.xxx.'(111) 这个错误. 经过重复折腾: 确 ...

  6. 【Web API系列教程】1.2 — Web API 2中的Action Results

    前言 本节的主题是ASP.NET Web API怎样将控制器动作的返回值转换成HTTP的响应消息. Web API控制器动作能够返回下列的不论什么值: 1. void 2. HttpResponseM ...

  7. vue2.0 仿手机新闻站(七)过滤器、动画效果

    1.全局过滤器 (1)normalTime.js  自定义 将 时间戳 转换成 日期格式 过滤器 /** * 将 时间戳 转换成 日期格式 */ export const normalTime = ( ...

  8. Vue2.0 :key作用

    转自:https://www.cnblogs.com/zhumingzhenhao/p/7688336.html 为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需 ...

  9. Hbase Basic

    启动:start-hbase.sh 停止:stop-hbase.sh 进入shell:hbase shell 状态:status 创建表:create 'tableName', 'colFam1' 查 ...

  10. Android 逐帧动画( Drawable 动画),这一篇就够了

    前言 作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像 ...