(原) Axis2 的 RPC 和 AXIOM 两种方式
因为项目需要在浏览器上调用 webservice ,在浏览器上返回自定义的 xml 格式结果,不需要返回 soap 封装后的结果,故使用如下方式实现
项目结构
<!--[if !vml]-->src
--com.lucky.ws
----AdminService.java
--META-INF
----services.xml
<!--[endif]-->
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 调用的话,返回结果是 soap 封装格式,这种方式在 WS 的方法参数和返回值上可以用户自定义(原始数据类型)
<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 方式,这种方式可以用户自己在代码中定义对象结构,在浏览器上可以返回用户自定义的 xml 格式,但是对应的 WS 方法的参数和返回值必须为 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 目录上右键,导出为 aar 包,将该包放入 tomcat_home/webapps/axis2/WEB-INF/services 下, tomcat 会自动部署,
访问:
在浏览器上访问:
http://localhost:8080/axis2/services /admin/validate?format=xml&component=aa <!--[if !supportNestedAnchors]--> <!--[endif]-->
说明:
http://localhost:8080/axis2/services 所有 webservice 都一样
/admin 在 services.xml 中定义的 webservice
/validate 在 services.xml 中定义暴漏的 WS 方法
?format=xml&component=aa 参数随便( AXIOM 会将他封装到 OMElement 的 Child 中,调用需要遍历 )