加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService的两种客户端调用方式

发布时间:2020-12-16 22:41:40 所属栏目:安全 来源:网络整理
导读:WebService的两种客户端调用方式 1.先搭建一个WebService接口.? 接口类:? Java代码?? package ?hello;?? ?? public ? interface ?IHello?{?? ?????? ???? public ?String?hello(String?str,String?str2)?;?? }?? 实现类:? class ?Hello? implements ?IHello{
WebService的两种客户端调用方式


1.先搭建一个WebService接口.?
接口类:?
Java代码??

收藏代码

  1. package?hello;??
  2. ??
  3. public?interface?IHello?{??
  4. ??????
  5. ????public?String?hello(String?str,String?str2)?;??
  6. }??

实现类:?
class?Hello?implements?IHello{??
  • ????????return?"Hello?world?,i'am?"+str+".???第二个参数?=?"+str2?;??
  • ????}??
    • WebService.rar?(9.8 MB)

    services.xml:?
    Xml代码??

    收藏代码

      <?xml?version="1.0"?encoding="UTF-8"?>??
    1. <beans?xmlns="http://xfire.codehaus.org/config/1.0">??
    2. ????service ????????name>Hello</namespace>rcfengserviceClass>hello.IHelloimplementationClass>hello.Hellobeans>??

  • web.xml:?
    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" ??servletservlet-name>XFireServletservlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServletload-on-startup>0servlet-mappingurl-pattern>/services/*welcome-file-listwelcome-file>index.jspweb-app注:这里使用XFire搭建WebService,固然需要引用XFire包,以及写法为XFire,不管用什么框架搭建WebService,访问原理都是一样的,所以用任何的客户端都可以访问,需要导入的包在文章尾部注明.?
    2.下面介绍调用WebService的两种客户端:?

    2.1 XFire客户端:?

    XFire客户端访问WebService,需要模拟出WS的接口,接口的结构一般定义接口的服务商会提供,如果是自己写的那就更明确了..?
    模拟WebService接口(这个接口写法跟WS服务器是一样的,但不是同一个项目也不是同一个类):?
    客户端接口类:?
    这里起名AnyName,意思是任何模拟接口的任何名字都可以,只要需要调用的方法的结构与WS相同即可.?
    package?xfire;??
  • interface?IAnyName?{??
  • 客户端调用类,测试类:?
    import?org.codehaus.xfire.XFire;??
  • import?org.codehaus.xfire.client.XFireProxyFactory;??
  • import?org.codehaus.xfire.service.Service;??
  • import?org.codehaus.xfire.service.binding.ObjectServiceFactory;??
  • class?XFireTest?{??
  • static?void?main(String[]?args)?{??
  • ??????????
  • try?{??
  • ??????????????
  • ????????????String?url?=?"http://localhost:9415/rcfeng-WebService/services/Hello"?;??
  • ????????????Service?service?=?new?ObjectServiceFactory().create(IAnyName.class)?;??
  • //??????????XFire?fire=XFireFactory.newInstance().getXFire();??
  • //??????????XFireProxyFactory?factory=new?XFireProxyFactory(fire);??
  • ????????????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;??
  • class?AxisTest?{??
  • ????????????String?str?=?"rcfeng"?;??
  • ????????????String?endpoint?=?"http://localhost:9415/rcfeng-WebService/services/Hello"?;??
  • new?Service()?;??
  • ????????????Call?call?=?(Call)?service.createCall()?;??
  • ????????????call.setTargetEndpointAddress(endpoint)?;??
  • ????????????call.setOperationName("hello")?;//ws方法名??
  • ????????????//一个输入参数,如果方法有多个参数,复制多条该代码即可,参数传入下面new?Object后面??
  • ????????????call.addParameter("parameter1",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN)?;??
  • ????????????call.addParameter("parameter2",250)"> ????????????call.setReturnType(XMLType.XSD_STRING)?;??
  • ????????????call.setUseSOAPAction(true)?;??
  • //??????????call.setSOAPActionURI("http://172.20.35.123:6110/cea-ws/services/ChangeMemberPinService");??
  • ????????????String?result?=?(String)?call.invoke(new?Object[]{str,"Parameter?two"})?;??
  • ????????????System.out.println(result);??
  • 以上代码本人测试通过.?
    顺便说一点个人理解:?
    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包?


    • WebService.rar?(9.8 MB)

    附:报错处理:

    webservice [META-INF/xfire/services.xml] cannot be opened because it does not exist


    严重: Allocate exception for servlet XFireServlet
    java.io.FileNotFoundException: class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:137)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:167)


    在tomcate工程里的 WEB-INF/classes的文件夹下新建一个META-INF文件夹,然后在里面新建一个xfire文件夹,将services.xml文件放到xfire目录下即可解决。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    • 推荐文章
        热点阅读