什么是Web services
Web services是一种远程调用技术。通过 Web services,可以让应用程序向全世界发布功能或消息,不受操作系统和编程语言的限制,实现不同的应用程序与平台之间的数据交换。Web Services的平台的元素包括:WSDL和SOAP、UDDI。
WSDL (Web Services Description Language)
Web Services描述语言,是一种使用 XML 编写的文档,用来描述某个 web service详细情况,包括具体提供了哪些服务,服务的位置,、服务提供的操作(或方法),以及访问该服务需要遵循的的消息格式和协议细节等。SOAP (Simple Object Access Protocol)
简易对象访问协议,本质上还是 HTTP 协议,与普通的 HTTP 不同之处在于 SOAP 使用 XML 来编码消息。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息、可选的 Header 元素,包含头部信息、必需的 Body 元素,包含所有的调用和响应信息,以及可选的 Fault 元素,提供有关在处理此消息所发生错误的信息。UDDI (Universal Description Discovery and Integration)
通用描述、发现及整合,是一个独立于平台的框架,通过 Internet 来描述服务,发现企业,并对企业服务进行集成。简单来说就是是一种由 WSDL 描述,用 SOAP 进行通信,存储 web services 的信息的目录 。类似于门户网站,让用户很方便地就能知道有哪些 Web Service 可以访问。
如何发布webservice
服务端
第一步:定义接口
1
2
3
4
5//需要在接口上加@WebService注解
@WebService
public interface HelloService {
public String sayHello(String name);
}第二步:定义接口实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//实现类上也要加@WebService注解,而且要声明发布的具体是哪个接口
@WebService(endpointInterface = "com.demo.webservice.service.HelloService")
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String userName) {
if (userName != null) {
StringBuilder builder = new StringBuilder();
builder.append("Hello ");
builder.append(userName);
builder.append(", Today is ");
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
builder.append(today);
System.out.println("Service response success...");
return builder.toString();
}
System.out.println("参数非法");
return "非法参数,请输入姓名";
}
}第三步:发布服务
1
2
3
4
5
6
7public class DemoServer {
public static void main(String[] args) throws MalformedURLException {
//通过Endpoint发布服务,指定wsdl文件地址以及服务接口实现类
Endpoint.publish("http://127.0.0.1:8848/webservice/helloService",new HelloServiceImpl());
System.out.println("Service published success...");
}
}第四步:检查服务发布结果
在浏览器输入服务发布时指定的路径,末尾加上 ?wsdl 。按回车键,就可以看到到该服务的wsdl文件
http://127.0.0.1:8848/webservice/helloService?wsdl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.service.webservice.demo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://impl.service.webservice.demo.com/" name="HelloServiceImplService">
<import namespace="http://service.webservice.demo.com/" location="http://127.0.0.1:8848/webservice/helloService?wsdl=1"/>
<binding xmlns:ns1="http://service.webservice.demo.com/" name="HelloServiceImplPortBinding" type="ns1:HelloService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="sayHello">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="HelloServiceImplService">
<port name="HelloServiceImplPort" binding="tns:HelloServiceImplPortBinding">
<soap:address location="http://127.0.0.1:8848/webservice/helloService"/>
</port>
</service>
</definitions>
客户端
实现方法一:QNAME
客户端需要定义跟服务端一样的接口(实际上就是两边同时依赖同一个接口)
1
2
3
4
5//需要在接口上加@WebService注解
@WebService
public interface HelloService {
public String sayHello(String name);
}
调用服务端发布的 Web Service
1 | public class HelloClient { |
控制台会打印:
Hello 没头脑, Today is 2019-03-31
实现方法二:wsimport
通过wsimport工具自动生成客户端代码
按 win键+R键,在输入框中输入 cmd ,打开命令行窗口。在命令行中输入以下指令:1
wsimport -s D:\work\webservice-demo\webservice-client2\src\main\java -p com.demo.webservice.service -keep http://localhost:9090/service/sayHello?wsdl
指令说明:wsimport -s “src目录” -p “生成类所在包名” -keep “wsdl发布地址”
操作成功后就会在对应的路径下自动生成java文件
调用服务端发布的 Web Service
1 | public class HelloClient { |
控制台会打印:
Hello 不高兴, Today is 2019-03-31