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( 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; }
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;
@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
|
@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); System.out.println("Wsdl地址:" + address + "?wsdl"); } }
|
在 Spring Boot 中发布 WebService 服务
WSDL
WSDL是WebService的说明文档,可以在文档中知道服务提供了哪些方法,哪些参数,参数是什么类型等信息。打开上面发布的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]有:
- -d
在指定的目录生成class文件
- -clientjar
在当前目录生成jar文件,结合-d 可以在指定的目录生成jar文件
- -s
在指定的目录生成java源文件 , 使用一个 .
表示当前目录
- -p
指定生成文件的包结构
- -keep
在生成class文件,或者jar包时,同时保留java源文件
生成后如下图:
我们可以直接使用class文件,也可以把java文件放入项目里。
调用
1 2 3 4 5 6 7 8 9 10 11 12
|
public class App { public static void main(String[] args) { HelloWorldThreeService helloWorldThreeService = new HelloWorldThreeService(); String toyou = helloWorldThreeService.getHelloWorldThreePort().sayHello("HJW"); System.out.println(toyou); } }
|
返回如下: