(原) Axis2 的 RPC 和 AXIOM 兩種方式
因為項目需要在瀏覽器上調(diào)用
webservice
,在瀏覽器上返回自定義的
xml
格式結(jié)果,不需要返回
soap
封裝后的結(jié)果,故使用如下方式實現(xiàn)
項目結(jié)構(gòu)
src
--com.lucky.ws
----AdminService.java
--META-INF
----services.xml
package
com.lucky.ws;
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
AdminService {
???
/*
???
?* RPC
方式
???
?* public String
validate(String format, String component){
?????? System.out.println("afdasfasfdad");
??????
?????? return "<?xml version=\"1.0\"
encoding=\"UTF-8\"?>"
?????? +"admin>"
?????? +"status>"
?????? +"name>Server</name>"
?????? +"value>[ok|fail]</value>"
?????? +"/status>";
??? }*/
???
???
/*
???
?*
使用
AXIOM
方式
???
?*/
???
public
OMElement validate(OMElement e){
?????? OMFactory fac = OMAbstractFactory.getOMFactory();
?????? OMNamespace omNs =
??????????? fac.createOMNamespace(
""
,
"tns"
);
???????
??????? OMElement admin = fac.createOMElement(
"admin"
, omNs);
??????? OMElement status = fac.createOMElement(
"status"
, omNs);
??????? admin.addChild(status);
??????? OMElement name = fac.createOMElement(
"name"
, omNs);
??????? name.addChild(fac.createOMText(name,
"Service"
));
??????? status.addChild(name);
??????
??????? OMElement value = fac.createOMElement(
"value"
, omNs);
??????? value.addChild(fac.createOMText(value,
"[ok|fail]"
));
??????? status.addChild(value);
???????
??????? OMElement status2 =
fac.createOMElement(
"status"
, omNs);
??????? admin.addChild(status2);
??????? OMElement name2 = fac.createOMElement(
"name"
, omNs);
??????? name2.addChild(fac.createOMText(name2,
"Error"
));
??????? status2.addChild(name2);
??????
??????? OMElement value2 = fac.createOMElement(
"value"
, omNs);
???????
value2.addChild(fac.createOMText(value2,
"msg"
));
??????? status2.addChild(value2);
??????
?
return
admin;
??? }
}
<!--
???
使用
RPC
方式,這種方式如果在瀏覽器上直接使用
url
調(diào)用的話,返回結(jié)果是
soap
封裝格式,這種方式在
WS
的方法參數(shù)和返回值上可以用戶自定義(原始數(shù)據(jù)類型)
<service
name="admin" scope="application">???
??? <messageReceivers>???
??????? <messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>???
??????? <messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>???
??? </messageReceivers>???
??? <parameter
name="ServiceClass">com.lucky.ws.AdminService</parameter>???
</service>
-->
<!--
使用
AXIOM
方式,這種方式可以用戶自己在代碼中定義對象結(jié)構(gòu),在瀏覽器上可以返回用戶自定義的
xml
格式,但是對應(yīng)的
WS
方法的參數(shù)和返回值必須為
final OMElement
類型
-->
<service name=
"admin"
scope=
"application"
>
???
<operation
name=
"validate"
>
???????
<messageReceiver class=
"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"
/>
???
</operation>
???
<parameter
name=
"ServiceClass"
>
com.lucky.ws.AdminService
</parameter>
</service>
部署:
啟動 tomcat
在 Eclipse 中在項目 src 目錄上右鍵,導(dǎo)出為 aar 包,將該包放入 tomcat_home\webapps\axis2\WEB-INF\services 下, tomcat 會自動部署,
訪問:
在瀏覽器上訪問:
http://localhost:8080/axis2/services /admin/validate?format=xml&component=aa
說明:
http://localhost:8080/axis2/services ?? 所有 webservice 都一樣
/admin ?????????????????????????????????????????????????????????? 在 services.xml 中定義的 webservice
/validate????????????????????????????????????????????????????????? 在 services.xml 中定義暴漏的 WS 方法
?format=xml&component=aa??????????????????????????? 參數(shù)隨便( AXIOM 會將他封裝到 OMElement 的 Child 中,調(diào)用需要遍歷 )