webservice_java实现

本文深入探讨Webservice的基础概念,包括SOAP协议的工作原理及其版本差异,JAX-WS在服务端与客户端的开发流程,以及如何利用wsimport工具生成客户端代码。同时,文章还介绍了cxf框架在发布Webservice服务中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. webservice介绍

     1.1  webservice是使用http协议发送soap协议数据的一种远程调用技术。

     1.2 soap:简单对象访问协议

     1.2.1 soap协议格式:   

               必需有 Envelope 元素,此元素将整个 XML 文档标识为一条 SOAP 消息

               可选的 Header 元素,包含头部信息

               必需有Body 元素,包含所有的调用和响应信息

               可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

     1.2.2 请求

   1.2.3 响应

   1.2.4 soap1.1和soap1.2

    相同点:

              请求发送方式相同:都是使用POST

              协议内容相同:都有Envelope和Body标签

   不同点: 

              数据格式不同:content-type不同

                        SOAP1.1:text/xml;charset=utf-8

                        SOAP1.2:application/soap+xml;charset=utf-8

              命名空间不同:

                        SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/

                        SOAP1.2:http://www.w3.org/2003/05/soap-envelope

    1.2.5  Jaxws不支持SOAP1.2服务端发布,直接发布会报如下异常

              如果想发布SOAP1.2服务端,需要在服务端引入第三方JAR(jaxws-ri-2.2.8),在实现类上加入如下注解

             @BindingType(SOAPBinding.SOAP12HTTP_BINDING)

    1.2.6 wsimport介绍

              Wsimport就是jdk提供的的一个工具,他作用就是根据WSDL地址生成客户端代码

              Wsimport位置JAVA_HOME/bin

              Wsimport常用的参数:

                          -s,生成java文件的

                          -d,生成class文件的,默认的参数

                          -p,指定包名的,如果不加该参数,默认包名就是wsdl文档中的命名空间的倒序

             Wsimport仅支持SOAP1.1客户端的生成,不支持发布,肯定不支持客户端生成,这是显而易见的

2. jaxws开发webservice

2.1 服务端

2.1.1 创建SEI(Service Endpoint Interface)接口,本质上就是Java接口    

package com.ghl;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

/**
 * @Author : ganhonglaing
 * @Date : 2018/10/23 19:35
 * @Description:  创建SEI(Service Endpoint Interface)接口,本质上是Java接口,在接口上用注解改变返回值和参数名称
 */
@WebService
public interface IHello {
    /**
     * @param name
     * @return
     */
    @WebMethod @WebResult(name = "result") String sayHello(@WebParam(name = "name") String name);
}

 2.1.2 创建SEI实现类,在实现类上加入@WebService

package com.ghl;

import javax.jws.WebService;

/**
 * @Author : ganhonglaing
 * @Date : 2018/10/23 19:39
 * @Description:   要发布接口,@WebService(endpointInterface = "com.ghl.IHello"),必须在接口上用webservice注解
 *                   否则,com.sun.xml.internal.ws.model.RuntimeModelerException: 端点接口com.ghl.IHello没有 Web 服务注释
 *                   发布接口,则在wsdl文档中portType为接口,如果不发布接口,则为类
 */
@WebService(endpointInterface = "com.ghl.IHello")
public class Hello implements IHello {
    @Override
    public String sayHello(String name) {
        return "hello,"+name;
    }
}

 2.1.3  发布服务,Endpoint发布服务,publish方法,两个参数:1.服务地址;2.服务实现类

package com.ghl;

import javax.xml.ws.Endpoint;

/**
 * @Author : ganhonglaing
 * @Date : 2018/10/23 19:47
 * @Description:发布服务
 */
public class Main {
    public static void main(String[] args) {
        Endpoint.publish("http://127.0.0.1:12345/hello",new Hello());
    }
}

2.1.4 测试服务是否发布成功,通过阅读使用说明书,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功。

     在浏览器中访问http://127.0.0.1:12345/hello?wsdl,结果如下图所示:

    wsdl解析:

                  (1)service标签:服务视图,通过get+子标签port的name属性,得到服务实现类,通过子标签port的binding属性可以定位到binding标签;

                    (2)   binding标签:为每个服务端点定义消息格式和协议细节,通过binding的type属性定位到portType标签

                  (3)portType标签:服务端点,描述 web service可被执行的操作方法,以及相关的消息

                    (4)message标签:定义一个操作(方法)的数据参数(可有多个参数)

                    (5)types标签:定义 webservice 使用的全部数据类型,通过上图箭头所指的地址可以看到如下图所示:

                        箭头指向的name属性值可以通过@WebResult(设置返回值名称),@WebParam(设置参数名称)来自定义,                          如果不定义,则为默认值,arg0,arg1....  

2.2 客户端开发

2.2.1 wsimport命令生成客户端代码   wsimport -p com.ghl http://127.0.0.1:12345/hello?wsdl

          -p    指定包名

2.2.2 根据使用说明书,使用客户端代码调用服务端

            (1)创建服务视图,视图是从service标签的name属性获取

            (2)获取服务实现类,实现类从service的子标签port标签的get+name属性获取

            (3)获取查询方法,从portType的operation标签的name属性值获取

package com.ghl;

/**
 * @Author : ganhonglaing
 * @Date : 2018/10/23 21:30
 * @Description:
 */
public class Main {
    public static void main(String[] args) {
        //新建服务类
        HelloService service = new HelloService();
        //获取服务实现类
        IHello hello = service.getHelloPort();
        //调用方法
        String result = hello.sayHello("tom");
        System.out.println(result);
    }
}

3. cxf发布webservice服务(服务端客户端)

4. cxf发布集成spring发布webservice 服务(服务端客户端)

5. cxf发布rest风格的webservice服务(服务端客户端)

6. cxf集成spring发布rest风格的webservice服务(服务端客户端)

7. webservice通用客户端实现(不需要用工具生成客户端代码)

3-7的代码见我github: https://github.com/honglianggan/webservice

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值