webservice(二)cxf实现客户端 和 wsdl阅读

一、cxf实现客户端

1、引入依赖

<!-- 要进行jaxws 服务开发 -->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.0.1</version>
</dependency>

<!-- 内置jetty web服务器  -->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>3.0.1</version>
</dependency>

2、代码

@WebService
public interface HelloService {
    /**
     * 对外发布服务的接口的方法
     * 与上篇的讲的服务端一样的接口
     */
    String sayHello(String name);

    //User就是简定义的实体类,成员变量分别是id,addr,name,类型都为String
    User addUser(User user);

    void test(String a, String b);
}
public class Client {
    public static void main(String[] args) {
        //  服务接口访问地址:http://localhost:8000/ws/hello

        // 创建cxf代理工厂
        JaxWsProxyFactoryBean factory = new  JaxWsProxyFactoryBean();

        //  设置远程访问服务端地址
        factory.setAddress("http://localhost:8000/ws/hello");

        //  设置接口类型
        factory.setServiceClass(HelloService.class);
        //factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());
        //  对接口生成代理对象
        HelloService helloService = factory.create(HelloService.class);

        //  代理对象对象  class com.sun.proxy.$Proxy34       [Java代理: 1. 静态代理;  2.动态代理(jdk接口代理、cglib子类代理)]    $CGLIB123
        System.out.println(helloService.getClass());

        // 远程访问服务端方法
        String content = helloService.sayHello("Jet");
        System.out.println(content);
    }
}

先运行之前的服务端,然后再运行这里的客户端,这样就在不同系统间用webService进行了接入通信 。

二、wsdl

若是自己写客户端,然后自己写客户端,这样你自然是能写出客户端的代码。但是有时候,就是涉及用webService去和别家的系统对接数据。这时人家通常会给你一个wsdl链接。要怎么对接这个数据?代码要怎么写,就是通过查看这个wsdl。

wsdl就是webService接口调用说明书。在服务端启动后,就可以在网页中访问webservice服务的wsdl链接,在网页中通过xml的格式,告诉对接这个webService的一些细节问题。

(一)、查看代理类和代理方法

之前写的webService服务接口的wsdl连接是http://localhost:8000/ws/hello?wsdl,在浏览器中直接访问即可,如图

 

阅读wsdl,需要从下往上读。

在根标签definitions中有三个标签,分别是service、binding和import标签。

1、server标签中,找到这个接口的地址。代理工厂设置访问地址就是这个http://localhost:8000/ws/hello

2、binding标签中,找到服务的代码类以及代理的方法。这里的代理类是HelloService,代理方法是sayHello、test和addUser

3、import标签中,找到namespace,值是service.itheima.com,这个是hellowService类所在的包的包名。不过需要返回过看,即com.itheima.service.

location是一个连接http://localhost:8000/ws/hello?wsdl=HelloService.wsdl,可以在浏览器中访问这个连接,作用是查看每个方法的入参和出参。

(二)、查看方法的入参和出参

之后,还需要看这些方法应该会什么参数,返回什么类型的值。所以访问

http://localhost:8000/ws/hello?wsdl=HelloService.wsdl 如图:

这里也需要从下往上看。

1、portType标签

可以从这里看出,在一个HelloService中有三个方法adduser,test和sayHello.即三个operation标签。

在operation标签中,定义了方法的入参和出参(传入参数与返回参数 )。可是这里仍然不知道方法传入什么,所以需要再其它地方查看。先记住input和output标签中的name属性的值。

比如addUser方法中,分别是adduser和addUserResponse.

注意:在不同的服务端实现,portType这个标签可能不一定有,但是我们之前在http://localhost:8000/ws/hello?wsdl中已经知道了代理类和代理方法。在找下文讲的complexType标签时,记住方法名是入参的定义,方法名+Response是出参的定义,对应去找即可。

2、complexType标签

这时看到顶部,types标签,里面有schema标签,其中会许多complexType标签,看他们的name值,会看到adduser和addUserReponse

这里面就定义了方法的准确的入参和出参。如下图,

刚才addUser是入参,传入参数类型是User。User是什么类型?需要在name为user的complexType中查看。

可以看到User有三个成员属性,addr,id和name。它们的类型都是String。

 

然后再看addUserResponse,这是出参。返回的也是user类型的数据。若是其它类型的数据,就去找name为这个值的complexType标签查看详细。

至此,就可以明白一个方法应该如何调用。就可以写出我们的代理Service类及方法。如下

@WebService
public interface HelloService {

    User addUser(User user);

}

之后,再按照以上步骤,就可以写出完整的Service类。

三、总结

service标签 查看 接口地址

binding标签 查看 接口的代理类和代理方法

import标签 查看  包名和代理方法详细说明地址

complexType标签查看 方法的入参和出参

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值