资源
axis2 服务端实现
服务端代码
package com.axis2.demo;
public class axis2Server {
public String sayGoodBye(String name){
return "goodbye,"+name;
}
public String sayHelloCity(String city){
return "hi,"+city;
}
public String getHelloWorld(){
return "Hello,World";
}
}
服务端配置
在WEB-INFO
目录下创建services\axis2Demo\META-INF
目录,在该目录下创建services.xml
文件,文件内容如下:
<!-- name 指定接口名称,用户自定义 -->
<service name="test">
<!-- 指定接口的全路径名,这里是com.axis2.demo包下的axis2Server类 -->
<parameter name="ServiceClass">
com.axis2.demo.axis2Server
</parameter>
<!-- 指定接口中公开的方法,name为接口中的方法名 -->
<operation name="sayGoodBye">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="sayHelloCity">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="getHelloWorld">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
</service>
如果调用的方法没有返回值,则messageReceiver的class属性值设置为org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
web.xml
中配置:
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
获取wsdl内容
http://localhost:8080/axis2Demo/services/test?wsdl
axis2Demo:为项目名称
services:为固定名称
HelloWorld:为接口名称,为services.xml文件中用户自定义的接口名称
axis2 客户端实现
package com.axis2.demo;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import javax.xml.namespace.QName;
public class axis2Client {
public static void main(String[] args) {
String url = "http://127.0.0.1:8080/axis2Demo/services/test";
String result = null;
try {
// 使用RPC方式调用WebService,这与服务端配置时指定的messageReceiver有关
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
options.setTo(targetEPR);
// 指定接口的命名空间(targetNamespace属性值)和要调用的方法名
QName methodName = new QName("http://demo.axis2.com", "sayGoodBye");
// 指定接口方法的参数值
Object[] argsArr = new Object[] { "java" };
// 指定返回值的数据类型的Class对象
Class[] resultTypeArr = new Class[] { String.class };
result = (String) serviceClient.invokeBlocking(methodName,
argsArr, resultTypeArr)[0];
System.out.println(result);
methodName = new QName("http://demo.axis2.com", "sayHelloCity");
argsArr = new Object[] { "武汉" };
System.out.println(serviceClient.invokeBlocking(methodName,
argsArr, resultTypeArr)[0]);
methodName = new QName("http://demo.axis2.com", "getHelloWorld");
System.out.println(serviceClient.invokeBlocking(opAddEntry,
new Object[] {}, resultTypeArr)[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- invokeBlocking方法有三个参数
第一个参数的类型是QName对象,表示要调用的方法名;
第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。 - 当方法没有参数时,invokeBlocking方法的第二个参数值要使用new Object[]{}
- 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同
补充资料
曾经做过一个项目,接口提供方使用.net
提供接口,我们客户端使用的语言为java,下面贴出当时做测试时使用的客户端代码
/**
* Webservice调用 新增部门
* 客户端实现方式为:axis2
* 服务端实现方式为:soap服务端
* @author Administrator
*
*/
public class Test06 {
private static EndpointReference targetEPR = new EndpointReference("http://localhost:8080/n_HISWebService.asmx?wsdl" );
public static void main(String[] args) {
Options options = new Options();
options.setAction("HISWebService/of_SetDeptStatus" );//调用接口方法(接口命名空间/接口方法)
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
options.setTo( targetEPR); // 设置接口地址
options.setProperty(HTTPConstants.CHUNKED , "false");//设置不受限制.
ServiceClient sender = null;
try {
sender = new ServiceClient();
sender.setOptions(options);
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("HISWebService" , "" );
OMElement method = fac.createOMElement("of_SetDeptStatus" , omNs);
OMElement param1 = fac.createOMElement("iHRP_DEPT_CODE" , omNs);// 设置入参名称
OMElement param2 = fac.createOMElement("sVALID_FLAG" , omNs);// 设置入参名称
param1.setText( "1");//设置参数值
param2.setText( "Y");//这是参数值
method.addChild(param1);
method.addChild(param2);
method.build();
System. out.println("method:" + method.toString());
OMElement response = sender.sendReceive(method);
System. out.println("response:" + response);
OMElement elementReturn = response.getFirstElement();
System. out.println("cityCode:" + elementReturn.getText());
} catch (AxisFault e) {
System. out.println("Error" );
e.printStackTrace();
}
}
}