axis2 webservice入门知识(JS,Java,PHP调用实例源码)

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

相关推荐