apacheuk 2011-12-06
背景简介
最近接触到一个银行接口的案子,临时需要用到axis2webservice。自己现学现总结的一些东西,留给新手。少走弯路。
Axis2简介
①采用名为AXIOM(AXIsObjectModel)的新核心XML处理模型,利用新的XML解析器提供的灵活性按需构造对象模型。
②支持不同的消息交换模式。目前Axis2支持三种模式:In-Only、Robust-In和In-Out。In-Only消息交换模式只有SOAP请求,而不需要应答;Robust-In消息交换模式发送SOAP请求,只有在出错的情况下才返回应答;In-Out消息交换模式总是存在SOAP请求和应答。
③提供阻塞和非阻塞客户端API。
④支持内置的Web服务寻址(WS-Addressing)。
⑤灵活的数据绑定,可以选择直接使用AXIOM,使用与原来的Axis相似的简单数据绑定方法,或使用XMLBeans、JiBX或JAXB2.0等专用数据绑定框架。
⑥新的部署模型,支持热部署。
⑦支持HTTP,SMTP,JMS,TCP传输协议。
⑧支持REST(RepresentationalStateTransfer)。
测试环境
【jdk1.6.0】+【tomcat-6.0.18】+【axis2-1.6.1】+【PHPVersion5.3.5】
未测试最低支持配置。
环境准备
一、部署Axis2环境.
1.下载安装
apache官网下载地址:http://ws.apache.org/axis2/选择StandardBinaryDistribution和WARDistribution
2.配置系统环境变量:
①添加AXIS2_HOME变量并指向StandardBinaryDistribution解压目标目录。例如:$AXIS2_HOME$=D:\axis2-1.6.1;
②将axis2.bat所在目录添加到系统环境变量path里。例如:将D:\axis2-1.6.1\bin添加到path现有值的最后面;
③将$AXIS2_HOME$\lib添加到系统环境变量classpath里。例如:将D:\axis2-1.6.1\lib添加到classpath现有值的最后面。
3.把WARDistribution解压到$tomcat_home$\webapps\axis2下(新建axis2文件夹),当然你也可以参照axis2文档里列出的步骤使用ant创建一个axis2.war,放到$tomcat_home$\webapps下,然后启动tomcat,那么tomcat会在webapps下自动创建一个axis2文件夹。
二、测试Axis2环境.
1.访问http://localhost:[port]/axis2(请将[port]修改成你的Tomcat对应端口,默认为8080);进入axis2的欢迎界面了。点击“Validate”。
如果有报错,则需根据错误信息检查上述步骤。如果没有错误信息,那么Axis2的环境测试算是通过了。
2.可以点击“Administration”并使用初始用户名和密码:admin;axis2登录,可以看到SystemComponents以及可以使用UploadServiceTools。部署新的arr文件了。另可去$tomcat_home$\webapps\axis2\WEB-INF\conf\axis2.xml下修改用户名和密码。
创建DemoHelloWorld
一、service端开发
1.创建一个java项目
2.新建类HelloWorld.java
参考代码:
packagesample;
importorg.apache.axiom.om.OMAbstractFactory;
importorg.apache.axiom.om.OMElement;
importorg.apache.axiom.om.OMFactory;
importorg.apache.axiom.om.OMNamespace;
publicclassHelloWorld{
publicOMElementsayHello(OMElementin){
Stringname=in.getText();
Stringinfo="你好"+name+",给你推荐http://www.sietoo.com";
OMFactoryfac=OMAbstractFactory.getOMFactory();
OMNamespaceomNs=fac.createOMNamespace("http://www.sietoo.com/","hw");
OMElementresp=fac.createOMElement("sayHelloResponse",omNs);
resp.setText(info);
returnresp;
}
}
3.新建文件META-INF\services.xml
参考代码:
<?xmlversion="1.0"encoding="UTF-8"?>
<servicename="HelloWorld">
<description>
ThisisasampleWebService.
</description>
<parametername="ServiceClass"locked="false">sample.HelloWorld</parameter>
<operationname="sayHello">
<messageReceiverclass="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
</service>
二、项目打包并发布
1.可使用你熟悉的IDE进行打包成HelloWorld.aar
参考直接打包方式:
在命令符行境下,将当前目录切换到该项目包下。如博主的例子就需要切换到sample所在的文件夹,注意并非切换进sample。使用如下命令:jarcvfHelloWorld.aar.完成在当前目录生成HelloWorld.aar。请注意命令末尾的点“.”。
2.发布,使用前面提到的登录axis2后看到的UploadService工具将HelloWorld.arr部署到Tomc上。
3.发布测试,如博主例子访问http://localhost:8088/axis2/services/HelloWorld?wsdl查看第2步骤中部署的HelloWrold的描述文件。
如果有报错,则需根据错误信息检查上述步骤。如果没有错误信息,那么HelloWorld的service端就算完成了。
三、简单客户端调用
1.一个简单的Java调用客户端。
参考代码:
packageexample.client;
importorg.apache.axiom.om.OMAbstractFactory;
importorg.apache.axiom.om.OMElement;
importorg.apache.axiom.om.OMFactory;
importorg.apache.axiom.om.OMNamespace;
importorg.apache.axis2.addressing.EndpointReference;
importorg.apache.axis2.client.Options;
importorg.apache.axis2.client.ServiceClient;
publicclassTestClient{
privatestaticEndpointReferencetargetEPR=newEndpointReference
("http://localhost:8080/axis2/services/HelloWorld");
publicstaticOMElementgetSayHelloOMElement(){
OMFactoryfac=OMAbstractFactory.getOMFactory();
OMNamespaceomNs=fac.createOMNamespace("http://www.sietoo.com/","hw");
OMElementmethod=fac.createOMElement("sayHello",omNs);
method.setText("andy");
returnmethod;
}
publicstaticvoidmain(String[]args){
try{
Optionsoptions=newOptions();
options.setTo(targetEPR);
ServiceClientsender=newServiceClient();
sender.setOptions(options);
OMElementsayHello=TestClient.getSayHelloOMElement();
OMElementresult=sender.sendReceive(sayHello);
System.out.println(result);
}
catch(ExceptionaxisFault){
axisFault.printStackTrace();
}
}
}
编译此文件,并执行。
如果有报错,则需根据错误信息检查上述步骤。如果没有错误信息,那么DemoHelloWorld就完满完成。
各类客户端调用实例
一、java调用axis2webservice(包括单个参数和多个参数方法的调用)
参考代码:
packageexample.client;
importorg.apache.axiom.om.OMAbstractFactory;
importorg.apache.axiom.om.OMElement;
importorg.apache.axiom.om.OMFactory;
importorg.apache.axiom.om.OMNamespace;
importorg.apache.axis2.addressing.EndpointReference;
importorg.apache.axis2.client.Options;
importorg.apache.axis2.client.ServiceClient;
publicclasss2{
privatestaticEndpointReferencetargetEPR=newEndpointReference("http://www.sietoo.com/axis2/services/SVAMobileWebService");
publicstaticOMElementgetSayHelloOMElement(){
OMFactoryfac=OMAbstractFactory.getOMFactory();
OMNamespaceomNs=fac.createOMNamespace("http://www.sietoo.com","andy");
//测试调用bandMobileNo(多参数方法)
OMElementbandMobileNo=fac.createOMElement("bandMobileNo",omNs);
OMElementUserId=fac.createOMElement("UserId",omNs);
OMElementpassword=fac.createOMElement("password",omNs);
OMElementbindingBank=fac.createOMElement("bindingBank",omNs);
UserId.addChild(fac.createOMText(UserId,"18629078140"));
password.addChild(fac.createOMText(password,"mynewpassword"));
bindingBank.addChild(fac.createOMText(bindingBank,"622260062001991159"));
bandMobileNo.addChild(UserId);
bandMobileNo.addChild(password);
bandMobileNo.addChild(bindingBank);
returnbandMobileNo;
//测试调用getAccountInfo(单参数方法)
//OMElementgetAccountInfo=fac.createOMElement("getAccountInfo",omNs);
//OMElementaccountNum=fac.createOMElement("accountNum",omNs);
//accountNum.addChild(fac.createOMText(accountNum,"18629078140"));
//getAccountInfo.addChild(accountNum);
//returngetAccountInfo;
}
publicstaticvoidmain(Stringargs[]){
try{
Optionsoptions=newOptions();
options.setTo(targetEPR);
ServiceClientsender=newServiceClient();
sender.setOptions(options);
OMElementsayHello=s2.getSayHelloOMElement();
OMElementresult=sender.sendReceive(sayHello);
System.out.println(result);
}
catch(ExceptionaxisFault){
axisFault.printStackTrace();
}}}
二、PHP调用axis2webservice(包括调用多参数,但参数方法)
1.使用Soap调用(需要PHP的版本支持)
<?php
$wsdl='http://www.sietoo.com/axis2/services/SVAMobileWebService?wsdl';
$soap=newSoapClient($wsdl,array('trace'=>false,'cache_wsdl'=>WSDL_CACHE_NONE));
$soap=newSoapClient($wsdl);
$method="bandMobileNo";
if(isset($_POST['passwd'])&&isset($_POST['UserId'])&&isset($_POST['bindingBank'])){
$params=array('UserId'=>$_POST['UserId'],'password'=>$_POST['passwd'],'bindingBank'=>$_POST['bindingBank']);
try{
$result=$soap->$method($params);
echo$result->return;
echo'<br>';
}catch(SoapFault$e){echo$e->getMessage();}
}
?>
<html>
<head>
<title>bandMobileNo</title>
</head>
<body>
<formmethod="Post"action="">
tel.
<inputtype="text"name="UserId"value="18629078888"/>
pwd.
<inputtype="password"name="passwd"value="admin"/>
cardno.
<inputtype="text"name="bindingBank"value="622260062001991159"/>
<inputtype="submit"name="submit"value="Submit"/>
</form>
</body>
</html>
2使用Nusoap调用(需要下载nusoap.php附下载地址:http://download.csdn.net/detail/mr_z_andy/3845711)
分如下两种方式:
①直接调用
<?
/*************************************************************/
/*文件名:soapclient.php
/*说明:WebService接口客户端例程
/*作者:www.sietoo.com
/*************************************************************/
include('NuSoap.php');
//创建一个soapclient对象,参数是server的WSDL
$client=newsoapclient('http://localhost/Webservices/Service.asmx?WSDL','wsdl');
//参数转为数组形式传递
$aryPara=array('strUsername'=>'username','strPassword'=>MD5('password'));
//调用远程函数
$aryResult=$client->call('login',$aryPara);
//echo$client->debug_str;
/*
if(!$err=$client->getError()){
print_r($aryResult);
}else{
print"ERROR:$err";
}
*/
$document=$client->document;
echo<<<SoapDocument
<?xmlversion="1.0"encoding="GB2312"?>
<SOAP-ENV:EnvelopeSOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:si="http://soapinterop.org/xsd">
<SOAP-ENV:Body>
$document
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SoapDocument;
?>
②代理调用
<?
/*************************************************************/
/*文件名:soapclient.php
/*说明:WebService接口客户端例程
/*作者:www.sietoo.com
/*************************************************************/
require('NuSoap.php');
//创建一个soapclient对象,参数是server的WSDL
$client=newsoapclient('http://localhost/Webservices/Service.asmx?WSDL','wsdl');
//生成proxy类
$proxy=$client->getProxy();
//调用远程函数
$aryResult=$proxy->login('username',MD5('password'));
//echo$client->debug_str;
/*
if(!$err=$proxy->getError()){
print_r($aryResult);
}else{
print"ERROR:$err";
}
*/
$document=$proxy->document;
echo<<<SoapDocument
<?xmlversion="1.0"encoding="GB2312"?>
<SOAP-ENV:EnvelopeSOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:si="http://soapinterop.org/xsd">
<SOAP-ENV:Body>
$document
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SoapDocument;
?>
三、JS客户调用axis2webservice(包括调用多参数,但参数方法)
1实例①
<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default3.aspx.cs"Inherits="Default3"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title></title>
<scripttype="text/javascript">
functionRequestWebService(){
//这是我们在第一步中创建的Web服务的地址
varURL="http://localhost/YBWS/WebService.asmx";
//在这处我们拼接
vardata;
data='<?xmlversion="1.0"encoding="utf-8"?>';
data=data+'<soap12:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">';
data=data+'<soap12:Body>';
data=data+'<HelloWorldxmlns="http://tempuri.org/"/>';
data=data+'</soap12:Body>';
data=data+'</soap12:Envelope>';
//创建异步对象
varxmlhttp=newActiveXObject("Microsoft.XMLHTTP");
xmlhttp.Open("POST",URL,false);
xmlhttp.SetRequestHeader("Content-Type","application/soap+xml");
xmlhttp.Send(data);
document.getElementById("data").innerHTML=xmlhttp.responseText;
}
</script>
</head>
<body>
<formid="form1"runat="server">
<div>
<inputid="One"type="button"value="JsCallWebService"onclick="RequestWebService()"/>
</div>
<divid="data">
</div>
</form>
</body>
</html>
2实例②Ajax直接调用,不推荐
下面仅贴出JS段代码,供参考。
varxmlHttp=null;
varbankno=null;
vartelno=null;
varcheckid=false;
functioncreateXMLHttpRequest(){
if(window.XMLHttpRequest){
//Firefox,Mozillar,Opera,Safari,IE7,IE8
xmlHttp=newXMLHttpRequest();
//Mozillar浏览器的BUG进行修正的
if(xmlHttp.overrideMimeType){
xmlHttp.overrideMimeType("text/html");
}
}elseif(window.ActiveXObject){
//针对IE的各种版本
varversions=['Microsoft.XMLHTTP','MSXML.XMLHTTP',
'Microsoft.XMLHTTP','Msxml2.XMLHTTP.7.0',
'Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0',
'Msxml2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP'];
//尝试创建XMLHttpRequest对象
for(vari=0;i<versions.length;i++){
try{
xmlHttp=newActiveXObject(versions[i]);
break;
}catch(e){
}
}
}
}
functionAsynRequest(){
createXMLHttpRequest();
if(xmlHttp==null)
{
alert("不能创建XmlHttpRequest对象");
return;
}
xmlHttp.open("GET","http://www.sietoo.com/axis2/services/demoService/doTest?Userid="+telno+"&bindingBank="+"&bindingBank="+bankno,false);
xmlHttp.setRequestHeader("Connection","close");
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
if(xmlHttp.responseXML==null)
{
return;
}
varres2=xmlHttp.responseXML.getElementsByTagName("ns:return")[0].firstChild.nodeValue;
//res2即为返回值。
return;
}
}
}
}
xmlHttp.send();
return;
}
欢迎更多讨论:andy#sietoo.com