背景簡(jiǎn)介
成都創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)定制網(wǎng)站制作,是成都網(wǎng)站制作公司,為成都純水機(jī)提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站改版熱線:028-86922220
最近接觸到一個(gè)銀行接口的案子,臨時(shí)需要用到axis2 webservice。自己現(xiàn)學(xué)現(xiàn)總結(jié)的一些東西,留給新手。少走彎路。
Axis2簡(jiǎn)介
①采用名為 AXIOM(AXIs Object Model)的新核心 XML 處理模型,利用新的XML解析器提供的靈活性按需構(gòu)造對(duì)象模型。
②支持不同的消息交換模式。目前Axis2支持三種模式:In-Only、Robust-In和In-Out。In-Only消息交換模式只有SOAP請(qǐng)求,而不需要應(yīng)答;Robust-In消息交換模式發(fā)送SOAP請(qǐng)求,只有在出錯(cuò)的情況下才返回應(yīng)答;In-Out消息交換模式總是存在SOAP請(qǐng)求和應(yīng)答。
③提供阻塞和非阻塞客戶端 API。
④支持內(nèi)置的 Web服務(wù)尋址 (WS-Addressing) 。
⑤靈活的數(shù)據(jù)綁定,可以選擇直接使用 AXIOM,使用與原來(lái)的 Axis 相似的簡(jiǎn)單數(shù)據(jù)綁定方法,或使用 XMLBeans、JiBX 或 JAXB 2.0 等專用數(shù)據(jù)綁定框架。
⑥新的部署模型,支持熱部署。
⑦支持HTTP,SMTP,JMS,TCP傳輸協(xié)議。
⑧支持REST (Representational State Transfer)。
測(cè)試環(huán)境
【jdk1.6.0】 +【tomcat-6.0.18】 + 【axis2-1.6.1】+【PHP Version 5.3.5】
未測(cè)試最低支持配置。
環(huán)境準(zhǔn)備
一、部署Axis2環(huán)境.
1.下載安裝
apache 官網(wǎng)下載地址:http://ws.apache.org/axis2/ 選擇 Standard Binary Distribution 和 WAR Distribution
2.配置系統(tǒng)環(huán)境變量:
①添加AXIS2_HOME變量并指向 Standard Binary Distribution解壓目標(biāo)目錄。例如:$AXIS2_HOME$ =D:\axis2-1.6.1;
②將axis2.bat所在目錄添加到系統(tǒng)環(huán)境變量path里。例如:將 D:\axis2-1.6.1\bin添加到path現(xiàn)有值的最后面;
③將$AXIS2_HOME$\lib添加到系統(tǒng)環(huán)境變量classpath里。例如:將D:\axis2-1.6.1\lib添加到classpath現(xiàn)有值的最后面。
二、測(cè)試Axis2環(huán)境.
1.訪問(wèn) http://localhost:[port]/axis2 (請(qǐng)將[port]修改成你的Tomcat對(duì)應(yīng)端口,默認(rèn)為8080);進(jìn)入axis2的歡迎界面了。點(diǎn)擊“Validate”。
如果有報(bào)錯(cuò),則需根據(jù)錯(cuò)誤信息檢查上述步驟。如果沒(méi)有錯(cuò)誤信息,那么Axis2的環(huán)境測(cè)試算是通過(guò)了。
創(chuàng)建Demo HelloWorld
一、service端開(kāi)發(fā)
1.創(chuàng)建一個(gè)java項(xiàng)目
2.新建類HelloWorld.java
參考代碼:
package sample;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
public class HelloWorld {
public OMElement sayHello(OMElement in){
String name=in.getText();
String info="你好"+name+",給你推薦http://www.sietoo.com";
OMFactory fac=OMAbstractFactory.getOMFactory();
OMNamespace omNs=fac.createOMNamespace("http://www.sietoo.com/","hw");
OMElement resp=fac.createOMElement("sayHelloResponse",omNs);
resp.setText(info);
return resp;
}
}
3.新建文件META-INF \ services.xml
參考代碼:
This is a sample Web Service.
二、項(xiàng)目打包并發(fā)布
1.可使用你熟悉的IDE進(jìn)行打包成HelloWorld.aar
參考直接打包方式:
在命令符行境下,將當(dāng)前目錄切換到該項(xiàng)目包下。如博主的例子就需要切換到sample所在的文件夾,注意并非切換進(jìn)sample。使用如下命令:jar cvf HelloWorld.aar . 完成在當(dāng)前目錄生成HelloWorld.aar 。請(qǐng)注意命令末尾的點(diǎn)“.”。
2.發(fā)布,使用前面提到的登錄axis2后看到的Upload Service 工具 將HelloWorld.arr部署到Tomc上。
3.發(fā)布測(cè)試,如博主例子訪問(wèn)http://localhost:8088/axis2/services/HelloWorld?wsdl查看第2步驟中部署的HelloWrold的描述文件。
如果有報(bào)錯(cuò),則需根據(jù)錯(cuò)誤信息檢查上述步驟。如果沒(méi)有錯(cuò)誤信息,那么HelloWorld的service端就算完成了。
三、簡(jiǎn)單客戶端調(diào)用
1.一個(gè)簡(jiǎn)單的Java調(diào)用客戶端。
參考代碼:
package example.client;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
public class TestClient {
private static EndpointReference targetEPR=new EndpointReference
("http://localhost:8080/axis2/services/HelloWorld");
public static OMElement getSayHelloOMElement(){
OMFactory fac=OMAbstractFactory.getOMFactory();
OMNamespace omNs=fac.createOMNamespace("http://www.sietoo.com/","hw");
OMElement method=fac.createOMElement("sayHello",omNs);
method.setText("andy");
return method;
}
public static void main(String[] args){
try{
Options options=new Options();
options.setTo(targetEPR);
ServiceClient sender=new ServiceClient();
sender.setOptions(options);
OMElement sayHello=TestClient.getSayHelloOMElement();
OMElement result=sender.sendReceive(sayHello);
System.out.println(result);
}
catch(Exception axisFault){
axisFault.printStackTrace();
}
}
}
編譯此文件,并執(zhí)行。
如果有報(bào)錯(cuò),則需根據(jù)錯(cuò)誤信息檢查上述步驟。如果沒(méi)有錯(cuò)誤信息,那么Demo HelloWorld就完滿完成。
各類客戶端調(diào)用實(shí)例
一、java調(diào)用axis2 webservice (包括單個(gè)參數(shù)和多個(gè)參數(shù)方法的調(diào)用)
參考代碼:
package example.client;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
public class s2 {
private static EndpointReference targetEPR=new EndpointReference("http://www.sietoo.com/axis2/services/SVAMobileWebService");
public static OMElement getSayHelloOMElement(){
OMFactory fac=OMAbstractFactory.getOMFactory();
OMNamespace omNs=fac.createOMNamespace("http://www.sietoo.com","andy");
//測(cè)試調(diào)用bandMobileNo (多參數(shù)方法)
OMElement bandMobileNo=fac.createOMElement("bandMobileNo",omNs);
OMElement UserId=fac.createOMElement("UserId",omNs);
OMElement password=fac.createOMElement("password",omNs);
OMElement bindingBank=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);
return bandMobileNo;
//測(cè)試調(diào)用getAccountInfo (單參數(shù)方法)
//OMElement getAccountInfo=fac.createOMElement("getAccountInfo",omNs);
//OMElement accountNum=fac.createOMElement("accountNum",omNs);
//accountNum.addChild(fac.createOMText(accountNum, "18629078140"));
//getAccountInfo.addChild(accountNum);
//return getAccountInfo;
}
public static void main(String args[]){
try{
Options options=new Options();
options.setTo(targetEPR);
ServiceClient sender=new ServiceClient();
sender.setOptions(options);
OMElement sayHello=s2.getSayHelloOMElement();
OMElement result=sender.sendReceive(sayHello);
System.out.println(result);
}
catch(Exception axisFault){
axisFault.printStackTrace();
}}}
二、PHP調(diào)用axis2 webservice (包括調(diào)用多參數(shù),但參數(shù)方法)
1.使用Soap調(diào)用(需要PHP的版本支持)
$wsdl='http://www.sietoo.com/axis2/services/SVAMobileWebService?wsdl';
$soap=new SoapClient($wsdl,array( 'trace'=>false,'cache_wsdl'=>WSDL_CACHE_NONE ) );
$soap=new SoapClient($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'
';
}catch(SoapFault $e){echo $e->getMessage();}
}
?>
2 使用Nusoap調(diào)用 (需要下載nusoap.php附下載地址:http://download.csdn.net/detail/mr_z_andy/3845711)
分如下兩種方式:
①直接調(diào)用
/*****/
/ 文件名 : soapclient.php
/ 說(shuō) 明 : WebService接口客戶端例程
/* 作 者 :www.sietoo.com
/*****/
include ('NuSoap.php');
// 創(chuàng)建一個(gè)soapclient對(duì)象,參數(shù)是server的WSDL
$client = new soapclient ( 'http://localhost/Webservices/Service.asmx?WSDL', 'wsdl' );
// 參數(shù)轉(zhuǎn)為數(shù)組形式傳遞
$aryPara = array ('strUsername' => 'username', 'strPassword' => MD5 ( 'password' ) );
// 調(diào)用遠(yuǎn)程函數(shù)
$aryResult = $client->call ( 'login', $aryPara );
//echo $client->debug_str;
/
if (!$err=$client->getError()) {
print_r($aryResult);
} else {
print "ERROR: $err";
}
/
$document = $client->document;
echo <<
$document
SoapDocument;
?>
②代理調(diào)用
/*****/
/ 文件名 : soapclient.php
/ 說(shuō) 明 : WebService接口客戶端例程
/* 作 者 :www.sietoo.com
/*****/
require ('NuSoap.php');
//創(chuàng)建一個(gè)soapclient對(duì)象,參數(shù)是server的WSDL
$client = new soapclient ( 'http://localhost/Webservices/Service.asmx?WSDL', 'wsdl' );
//生成proxy類
$proxy = $client->getProxy ();
//調(diào)用遠(yuǎn)程函數(shù)
$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 <<
$document
SoapDocument;
?>
三、JS客戶調(diào)用axis2 webservice (包括調(diào)用多參數(shù),但參數(shù)方法)
1 實(shí)例①
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
2實(shí)例② Ajax直接調(diào)用,不推薦
下面僅貼出JS段代碼,供參考。
var xmlHttp = null;
var bankno=null;
var telno=null;
var checkid=false;
function createXMLHttpRequest() {
if(window.XMLHttpRequest){
//Firefox ,Mozillar ,Opera ,Safari ,IE7 ,IE8
xmlHttp = new XMLHttpRequest();
//Mozillar瀏覽器的BUG進(jìn)行修正的
if(xmlHttp.overrideMimeType){
xmlHttp.overrideMimeType("text/html");
}
}else if(window.ActiveXObject){
//針對(duì)IE的各種版本
var versions = [ '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' ];
//嘗試創(chuàng)建XMLHttpRequest對(duì)象
for ( var i = 0; i < versions.length; i++) {
try {
xmlHttp = new ActiveXObject(versions);
break;
} catch (e) {
}
}
}
}
function AsynRequest() {
createXMLHttpRequest();
if (xmlHttp == null)
{
alert("不能創(chuàng)建 XmlHttpRequest 對(duì)象");
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 ;
}
var res2=xmlHttp.responseXML.getElementsByTagName("ns:return")[0].firstChild.nodeValue;
//res2即為返回值。
return ;
}
}
}
}
xmlHttp.send();
return ;
}