必威体育Betway必威体育官网
当前位置:首页 > IT技术

webservice_java实现

时间:2019-09-26 11:14:22来源:IT技术作者:seo实验室小编阅读:79次「手机版」
 

java webservice

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

相关阅读

Android近期任务列表Recent List(Recents Screen)的实现

一、明确android的近期任务是什么:我们的手机下方一般有三个键,一个是返回键,中间的是home键,另一个是RecentList键,也就是最近浏览记

Struts2实现简单的登陆 / 注册功能

我 是用idea写的。 需求分析: 用户进入首页,选择登陆,跳转到登陆 / 注册页面的登陆模块,如有账户,登陆成功跳转首页,并显示用户名;如没

“手机+AIoT”战略 能否带小米突出重围实现“稳三望一

作为曾经因手机而风光无限的小米,近期发展形势却不容乐观。小米手机国内销量下滑、股价一直徘徊在10港元以下,面对如今的局势小米正

笔记本怎么实现合上盖子也能使用外接显示器?

笔记本外接显示器合上盖子之后,外接显示器会跟随笔记本屏幕进入休眠状态,怎么实现合上盖子也能使用外接显示器呢?下面我们就来看看详

创业者精准引流的3大方式 轻松实现月入过万

大家好,我是梅宫主。今天与大家分享下如何搞流量。搞流量难不难?前几天,我与大家分享了赚钱万能公式:赚钱=产品的利润×流量&t

分享到:

栏目导航

推荐阅读

热门阅读