WebService的两种客户端调用方式
1.先搭建一个WebService接口.
接口类:
- package?hello;??
- ??
- public?interface?IHello?{??
- ??????
- ????public?String?hello(String?str,String?str2)?;??
- ??
- }??
实现类:
- package?hello;??
- ??
- public?class?Hello?implements?IHello{??
- ??
- ????public?String?hello(String?str,String?str2)?{??
- ????????return?"Hello?world?,i'am?"+str+".???第二个参数?=?"+str2?;??
- ????}??
- ??
- }??
services.xml:
- <?xml?version="1.0"?encoding="UTF-8"?>??
- <beans?xmlns="http://xfire.codehaus.org/config/1.0">??
- ????<service>??
- ????????<name>Hello</name>??
- ????????<namespace>rcfeng</namespace>??
- ????????<serviceClass>hello.IHello</serviceClass>??
- ????????<implementationClass>hello.Hello</implementationClass>??
- ????</service>??
- </beans>??
web.xml:
- <?xml?version="1.0"?encoding="UTF-8"?>??
- <web-app?xmlns="http://java.sun.com/xml/ns/javaee"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?version="2.5"?xsi:schemaLocation="http://java.sun.com/xml/ns/javaee???http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
- ??<servlet>??
- ????<servlet-name>XFireServlet</servlet-name>??
- ????<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>??
- ????<load-on-startup>0</load-on-startup>??
- ??</servlet>??
- ??<servlet-mapping>??
- ????<servlet-name>XFireServlet</servlet-name>??
- ????<url-pattern>/services/*</url-pattern>??
- ??</servlet-mapping>??
- ??<welcome-file-list>??
- ????<welcome-file>index.jsp</welcome-file>??
- ??</welcome-file-list>??
- </web-app>??
注:这里使用XFire搭建WebService,固然需要引用XFire包,以及写法为XFire,不管用什么框架搭建WebService,访问原理都是一样的,所以用任何的客户端都可以访问,需要导入的包在文章尾部注明.
2.下面介绍调用WebService的两种客户端:
2.1 XFire客户端:
XFire客户端访问WebService,需要模拟出WS的接口,接口的结构一般定义接口的服务商会提供,如果是自己写的那就更明确了..
模拟WebService接口(这个接口写法跟WS服务器是一样的,但不是同一个项目也不是同一个类):
客户端接口类:
这里起名AnyName,意思是任何模拟接口的任何名字都可以,只要需要调用的方法的结构与WS相同即可.
- package?xfire;??
- ??
- public?interface?IAnyName?{??
- ??????
- ????public?String?hello(String?str,String?str2)?;??
- ??
- }??
客户端调用类,测试类:
- package?xfire;??
- ??
- import?org.codehaus.xfire.XFire;??
- import?org.codehaus.xfire.client.XFireProxyFactory;??
- import?org.codehaus.xfire.service.Service;??
- import?org.codehaus.xfire.service.binding.ObjectServiceFactory;??
- ??
- public?class?XFireTest?{??
- ??
- ????public?static?void?main(String[]?args)?{??
- ??????????
- ????????try?{??
- ??????????????
- ????????????String?url?=?"http://localhost:9415/rcfeng-WebService/services/Hello"?;??
- ??????????????
- ????????????Service?service?=?new?ObjectServiceFactory().create(IAnyName.class)?;??
- ??????????????
- ??
- ??
- ????????????XFireProxyFactory?factory?=?new?XFireProxyFactory()?;??
- ??????????????
- ????????????IAnyName?hello?=?(IAnyName)?factory.create(service,url)?;??
- ??????????????
- ????????????String?str?=?hello.hello("rcfeng","Parameter?two")?;??
- ??????????????
- ????????????System.out.println(str);??
- ??????????????
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ??????????
- ????}??
- }??
2.2 Axis客户端:
- package?axis;??
- ??
- import?org.apache.axis.client.Call;??
- import?org.apache.axis.client.Service;??
- import?org.apache.axis.encoding.XMLType;??
- ??
- public?class?AxisTest?{??
- ??????
- ????public?static?void?main(String[]?args)?{??
- ??????????
- ????????try?{??
- ??????????????
- ????????????String?str?=?"rcfeng"?;??
- ????????????String?endpoint?=?"http://localhost:9415/rcfeng-WebService/services/Hello"?;??
- ??????????????
- ????????????Service?service?=?new?Service()?;??
- ??????????????
- ????????????Call?call?=?(Call)?service.createCall()?;??
- ??????????????
- ????????????call.setTargetEndpointAddress(endpoint)?;??
- ????????????call.setOperationName("hello")?;??
- ??????????????
- ????????????call.addParameter("parameter1",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN)?;??
- ????????????call.addParameter("parameter2",javax.xml.rpc.ParameterMode.IN)?;??
- ????????????call.setReturnType(XMLType.XSD_STRING)?;??
- ????????????call.setUseSOAPAction(true)?;??
- ??
- ??????????????
- ????????????String?result?=?(String)?call.invoke(new?Object[]{str,"Parameter?two"})?;??
- ??????????????
- ????????????System.out.println(result);??
- ??????????????
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- }??
以上代码本人测试通过.
顺便说一点个人理解:
XFire客户端的调用方式,类似于先指定WS接口的结构,然后从远端地址实例化一个对象到本地,由于方法结构一样,所以可以强行转换.然后直接进行本地调用.
Axis客户端的调用方式类似于HTTP访问,设置好参数后直接远端调用.
?wsdl地址的来源=服务商提供,如果是你自己做的WebService的话,你可以访问默认格式:
http://[IP地址:端口]/[项目访问路径]/services
如
http://localhost:9415/rcfeng-WebService/services
至于url的源来,你要先拿到?wsdl地址,然后访问如:
http://localhost:9415/rcfeng-WebService/services/Hello?wsdl,然后拉到下面可以看到红色部分:
<wsdl:service name="Hello">
??? <wsdl:port name="HelloHttpPort" binding="tns:HelloHttpBinding">
??????? <wsdlsoap:address location="
http://localhost:9415/rcfeng-WebService/services/Hello" />
??? </wsdl:port>
</wsdl:service>
调用的方法名为:
<wsdl:operation name="
hello">
然后便可以调用WebService的接口了。
XFire需要用到的包:
activation-1.1.jar
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-httpclient-3.0.jar
commons-logging-1.0.4.jar
jaxen-1.1-beta-9.jar
jaxws-api-2.0.jar
jdom-1.0.jar
jsf-api.jar
jsf-impl.jar
jsr173_api-1.0.jar
jstl-1.2.jar
mail-1.4.jar
saaj-api-1.3.jar
saaj-impl-1.3.jar
spring-1.2.6.jar
stax-api-1.0.1.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.0.jar
xbean-2.2.0.jar
xbean-spring-2.8.jar
xfire-aegis-1.2.6.jar
xfire-annotations-1.2.6.jar
xfire-core-1.2.6.jar
xfire-java5-1.2.6.jar
xfire-jaxws-1.2.6.jar
xfire-jsr181-api-1.0-M1.jar
xfire-spring-1.2.6.jar
XmlSchema-1.1.jar
Axis需要用到的包:
axis.jar
commons-discovery-0.2.jar
注明:以上两种客户端本人是写在同一个项目里,所以Axis需要用到的包看上去少很多,是因为一些通用包在使用XFire的时候已经加进来了.
附上项目说明:
rcfeng-WebService 为WebService服务端项目
rcfeng-TestWebService 为客户端项目
rcfeng-WebService项目中没有包,可以到rcfeng-TestWebServiceWebRootWEB-INFlibXFire下获取,另外,rcfeng-WebService项目中是使用MyEclipse引用包,直接导入项目可能需要更新jar路径或删掉路径,然后自己导入jar包