WebService的简单实现

服务端

发布一个WebService,只需要几个注解:

  • @WebService

    注解在一个类上,声明一个WebServier 对外发布,public 方法都会默认发布

  • @WebMethod

    在方法上使用,可以对设置排除某个方法发布

  • @WebResult

    定义方法返回参数说明

  • @WebParam

    定义方法接收参数说明

简单WebService实例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* @WebService 注解声明一个WebServier对外发布,public 方法都会默认发布
* 被声明的类中必须有一个公开的方法,否则发布失败
*/
@WebService(
serviceName = "HelloWorl2", // 服务名
targetNamespace = "http://two.hjwjw.github.io" //命名空间,默认包名取反
)
public class HelloWorldTwo {
@WebMethod(operationName = "sayHiWithYou") //对外发布的方法名
public @WebResult(name = "toYou") String sayHi(@WebParam(name = "youName") String name) {
return "Hi,"+name;
}

@WebMethod(exclude = true) //表示排除这个方法
public String sayHello(String name) {
return "Hello,"+name;
}

/**
* protected、private、final、static方法不能对外公开
*/
private String sayLove(String name){
return "love you,"+ name;
}
protected String sayNo(String name){
return "No,"+ name;
}
public static String sayStatic(String name){
return "Static,"+name;
}
public final String sayFinal(String name){
return "final,"+name;
}
}

下面定义一个面向接口的WebServic。

服务接口

IHelloWorldThree.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package io.github.hjwjw.three;

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

/**
* The IHelloWorldThree class.
*
* @author hjwjw
* @date
*/
@WebService(
serviceName = "HelloWorldThree", //服务名
targetNamespace = "http://three.hjwjw.github.io" //命名空间,默认服务接口包名取反
)
public interface IHelloWorldThree {

@WebMethod(exclude = true)
String sayHi(String name) ;

@WebResult(name = "toYou") String sayHello(@WebParam(name = "youName") String name);
}

服务实现类

HelloWorldThree.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* The HelloWorldThree class.
* 面向接口的简单WebService发布
* @author
* @date
*/
@WebService(endpointInterface = "io.github.hjwjw.three.IHelloWorldThree") //设置服务端点接口,指定提供服务的接口
public class HelloWorldThree implements IHelloWorldThree {

@Override
public String sayHi(String name) {
return "Hi,"+name;
}
@Override
public String sayHello(String name) {
return "Hello,"+name;
}
}

发布WebService

app.java

1
2
3
4
5
6
7
8
9
10
11
public class App {
public static void main(String[] args) {
IHelloWorldThree helloWorldThree = new HelloWorldThree();
//自定义一个服务地址
String address = "http://127.0.0.1:7856/ws/three/hello";
//使用端点服务,将对象绑定到一个地址和端口,同时必须在端口后给服务取一个名称
Endpoint.publish(address,helloWorldThree);
//WebService服务说明文档wsdl地址
System.out.println("Wsdl地址:" + address + "?wsdl");
}
}

在 Spring Boot 中发布 WebService 服务

WSDL

WSDL是WebService的说明文档,可以在文档中知道服务提供了哪些方法,哪些参数,参数是什么类型等信息。打开上面发布的wsdl地址如下:

WSDL

分解

一个WSDL文档由四部分组成:

1、types

  指定了WebService用到的所有数据类型
2、message

  指明一个操作所用到的数据类型。

  sayHi是指sayHi方法的输入操作用到的数据类型,sayHiResponse是指sayHi的输出操作用到的数据类型。二者的element元素指出了与types中对应到的具体类型。

3、portType

  指出了这个WebService所有支持的操作,就是说有哪些方法可供调用。

  这里支持一个sayHi调用,它的输入和输出对应到sayHi和sayHiResponse这个两个数据类型。

4、binding

  soap12:binding元素的transport指明传输协议,这里是http协议。

  operation 指明要暴露给外界调用的操作。

  use属性指定输入输出的编码方式,这里没有指定编码。

5、services

  指定服务的一些信息,主要是指定服务的访问路径。

与下方的客户端调用联系,可以看出我们在使用客户端调用时应按如下步骤:

  • 创建服务实例

  • 使用服务实例调用port 再调用到具体方法

这里写图片描述

客户端

使用Java自带的命令生成客户端代码。

wsimport

cmd 命令

1
wsimport -s . http://127.0.0.1:7856/ws/three/hello?wsdl

wsimport命令用法
wsimport [options] WSDL_URI
比较常用的[options]有:

  1. -d
    在指定的目录生成class文件
  2. -clientjar
    在当前目录生成jar文件,结合-d 可以在指定的目录生成jar文件
  3. -s
    在指定的目录生成java源文件 , 使用一个 . 表示当前目录
  4. -p
    指定生成文件的包结构
  5. -keep
    在生成class文件,或者jar包时,同时保留java源文件

生成后如下图:

wsimport生成客户端代码

我们可以直接使用class文件,也可以把java文件放入项目里。

调用

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 通过wsimport 解析WSDL生成客户端代码调用WebService服务
* @author
*
*/
public class App {
public static void main(String[] args) {
HelloWorldThreeService helloWorldThreeService = new HelloWorldThreeService();
String toyou = helloWorldThreeService.getHelloWorldThreePort().sayHello("HJW");
System.out.println(toyou);
}
}

返回如下:

客户端调用返回