使用AXIS2为Client访问WebService

使用AXIS2,可以方便的构建WebService的服务器端,也可以很方便的作为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)

大部分时候,客户端不会提前获得服务器的证书导致出错。所以需要自己更新一下通信的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根据服务器端的设定而指定,一般是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. 需要通过代理服务器的情况。

这个按照官方网站的来就可以了。

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);

就可以通过代理服务器来访问了。

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

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

options.setProperty(HTTPConstants.CHUNKED, false);

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

以上,就是通过Axis2作为客户端访问WebService的几种情况,基本上一般的http环境差不多应该都能对付了。

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

使用AXIS2为Client访问WebService

时间: 2024-10-10 04:40:03

使用AXIS2为Client访问WebService的相关文章

webService总结(四)——使用axis2发布和调用webService

准备工作 Axis2 官网 http://axis.apache.org/  下载axis2相关资料 其中 axis2-1.6.2-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.6.2-war.zip文件用于将WebService发布到Web容器中.最后两个是axis2在eclipse中的插件. 大概说说这几个文件如何使用. 1.解压axis2-1.6.2-bin.zip到任意目录.然后在eclipse中按下图配置. 2.将axis2-1.6.2-war.zip文件解

【转】Spring的WebServiceTemplate访问WebService的方法及其本质原理

WebService客户端调用的本质就是将SAOP格式的XML通过通信协议发送到WebService的服务器端,然后接收服务器端返回的XML. 本文简单介绍一下如何通过Spring提供的WebServiceTemplate访问Webservice,WebServiceTemplate与调用webservice的客户端已及webservice服务器端示意图如下(图片来源于Spring in Action): 这里以SOAP over HTTP为例,开发步骤如下: 1,在Spring的配置文件中配置

php——SoapClient访问webservice

原文:php--SoapClient访问webservice 通过SoapClient调用天气预报 <?phpheader ( "Content-Type: text/html; charset=gb2312" );/** 指定WebService路径并初始化一个WebService客户端*/$ws = "http://www.webservicex.net/globalweather.asmx?wsdl";//webservice服务的地址$client =

ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也没什么大的差别. 在ASP.NET应用程序里使用ASP.NET AJAX访问WebService通常都是通过ScriptMananger引入WebService生成客户端代理的方法,同时也可以使用Microsoft Ajax Library来完成.本文将介绍在ASP.NET MVC中使用ASP.NE

myeclipse 10 +Axis2 1.62 开发WebService手记

由于临时需求,不得不用java来开发一个webservice,之前对java webservice一片空白.临时查资料,耗费近一天,终于搞定,效率是慢了点.呵呵. 首先 配置Tomcat 中WebService解析容器,下载Axis2-1.6.2 注意分别下载 红框的两个文件   其中注意将 axis2-1.6.2-war.zip 中axis2.war解压出 ,放到tomcat 中 webapps中,然后在浏览器中输入http://localhost:8080/axis2/ 测试容器是否成功.(

C语言访问webservice小例子

近期做的一个项目中,需要访问webservice获取一些json格式的数据.返回的页面内容只是json格式的数据,并不像实际页面那么复杂.所以不想再引入工具库,直接用socket简单实现了. 以下代码并不是实际项目源码,是我摘取出来整理成的一个小例子分享给大家.代码本身很容易理解,但是需要一些socket编程和http协议基础. #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #inc

android采用Ksoap2访问webservice,AndroidHttpTransport call方法异常

============问题描述============ 使用java工程以同样的方式去访问webservice没有任何问题,也返回正常的数据,但是在android中执行到call方法的时候就抛出异常,但是异常是null不能去取出正常的数据,代码如下,求各位大神指教一下 ============解决方案1============ 1.应用需要有访问网络的权限. 2. 4.0中不能再主线程中发起网络请求,这个坑我也坑了好久.

ajax的访问 WebService 的方法

转自原文 ajax的访问 WebService 的方法 如果想用ajax进行访问 首先在web.config里进行设置 添加在 <webServices> <protocols> <add name= "HttpPost" /> <add name= "HttpGet" /> </protocols> </webServices> <system.web>节点之下 这样就是可以通过u

走进http的世界------用C代码模拟浏览器IE(http client)访问web(http server)的行为

在本文中, 我们来玩一下http.   既然你看到了这篇文章, 那就说明你肯定直接或间接借助了http协议(浏览器的实现需要用到http协议). 很多书本把http介绍得玄乎其玄, 高深莫测, 其实,  http也没什么大不了的. 当我们用浏览器看登录www.baidu.com的时候, 浏览器相当于客户端, 而服务端是百度公司掌控着. 要想大致了解http,  网上资料可谓如山如海.作为一名程序员(注意, 我说的是程序猿), 我始终坚信, 没有代码, 没有实践, 只讲理论, 那就是扯淡, 尽管一