是什么?
Web服务是一种服务导向架构(SOA)的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。-- 维基百科
从上面维基百科的描述我们可以提炼出两个关键点:
- 是一种技术
- 通过标准的Web协议提供服务
- 保证不同平台的应用服务可以互相操作
这里的平台可以理解为不同的编程语言 所以我们可以将Web Service理解成下面这样?

那么问题来了?直接用HTTP不好吗?HTTP也是跨平台的。带着疑问我接着往下翻WebService的定义:
尽管W3C的定义涵盖诸多相异且无法区分的系统,不过通常我们指有关于主从式架构(Client-server)之间根据SOAP协议进行传递XML格式消息
这个主从式架构似乎有点拗口,那看到Client-Server没,改为客户端-服务端模式是不是更容易理解呢? 这段描述中我们可以提炼出来的一个关键点就是根据SOAP协议传递XML格式消息。这里有一个陌生的词SOAP。同时SOAP也是WebService四大组件之一:
- XML SOAP发送消息的基础
- SOAP(Simple Object Access Protocol) 简单对象访问协议
- WSDL(Web Service Description Language) WebService描述语言
- UDDI(UnviversalDescription ,Discovery,andIntegration) 统一描述发现和集成协议
下面会一一介绍这些词所代表的含义。
SOAP是什么?
SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构的信息。SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节省去格式化页面时间,以及不同应用程序之间按照HTTP通信协议,遵从XML格式执行资料互换,使其抽象于语言实现、平台和硬件。此标准由IBM、Microsoft、UserLand和DevelopMentor在1998年共同提出,并得到IBM、莲花(Lotus)、康柏(Compaq)等公司的支持,于2000年提交给万维网联盟(World Wide Web Consortium,W3C),目前SOAP 1.1版是业界共同的标准,属于第二代的XML协议(第一代具主要代表性的技术为XML-RPC以及WDDX)。 --- 维基百科
那SOAP是应用层的另一种协议喽?跟HTTP协议平级? HTTP是Hyper Text Transfer Protocol的首字母缩写, transfer是传输的意思. SOAP中没有这个T,那么应当不算跟HTTP协议平级的一层协议喽?你忘了WebSocket同样没带transfer. 这里只是皮一下。
这里面有一个关键描述就是"不同应用程序之间按照HTTP通信协议, 遵从XML格式执行资料互换"。所以SOAP还是使用HTTP协议进行传输,那SOAP协议规定了啥? 注意这个"遵从XML格式", 那么我们姑且就可以认为SOAP规定了XML格式, 在使用HTTP协议进行交换信息的时候发送的请求都是XML。
所以概括来说就是WebService可以通过HTTP协议发送请求和接收结果时, 发送的请求内容和结果内容都采用XML格式封装,并且增加了一些特定的HTTP请求头,用来说明请求和发送HTTP消息的内容格式, 这些特定的HTTP消息头和XML内容格式就是SOAP协议。
国内查询Web的归属地的就是一个WebService,地址如下:
WSDL
那如果我对你这个Web Service的服务有不理解的地方呢,那么请参考WSDL,WSDL提供"能办的事的文档说明": 对要提供的服务的一种描述格式。我想帮你的忙,但是我要告诉你我能干什么,以及干这些事需要的参数类型。在WSDL中,WSDL: Web Service Description Language WebService描述语言。WSDL文件时一个XML文档, 用于说明一组SOAP消息以及如何交换这些消息,即: 说明当前的服务在哪,有哪些接口可以调用,分别是什么方法,什么参数等信息。一个Web Service对应一个唯一的WSDL文档。
UDDI
UDDI: 统一描述发现和集成协议。UDDI是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。这个我们可以将其理解为一个微服务中注册中心的存在,如果发布的WebService服务比较多,那么就可以选择将服务发布注册到UDDI中。
小小总结一下
所以概括起来我们可以将WebService理解为下面这样:
开发WebService服务
上面讲了那么多,我们现在来开发一下WebService服务, 开发WebService服务常用的有以下几种方式:
- JDK发布请求WebService服务
- 使用CXF开发web service
- AXIS开发发布WebService
JDK开发WebService
先是开发服务端
首先先写一个服务, 先写一个接口:
WebService
public interface HelloWebService {
String sayHelloWorld();
}
@WebService
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String sayHelloWorld() {
return "hello bbbb";
}
}
然后在main函数中发布服务:
public class MyWebServiceServer {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/hello",new HelloWebServiceImpl());
System.out.println("webService 被启动了.......");
}
}
再写客户端
其实这个不用写, 我们可以生成, 用JDK自带wsimport可以帮我们自动生成客户端代码, 但是之前要配置环境变量。配置完成之后执行:
wsimport -keep http://localhost:8081/testWebService?wsdl -encoding : 指定编码格式 -keep:是否生成java源文件
-d:指定.class文件的输出目录
-s:指定.java文件的输出目录
-p:定义生成类的包名,不定义的话有默认包名 -verbose:在控制台显示输出信息
-b:指定jaxws/jaxb绑定文件或额外的schemas
-extension:使用扩展来支持SOAP1.2
调用测试:
public class MyClient {
public static void main(String[] args) {
org.example.webservice.HelloWebServiceImplService hss = new org.example.webservice.HelloWebServiceImplService();
org.example.webservice.HelloWebServiceImpl helloWorld = hss.getHelloWebServiceImplPort();
System.out.println(helloWorld.sayHelloWorld());
}
}
Apache CXF 开发和解析
第一步引入依赖:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.5</version>
</dependency>
public interface LoginService {
String sayHello();
}
@WebService
public class LoginServiceImpl implements LoginService {
@Override
public String sayHello() {
return "hello";
}
}
public class CxfWebServiceServer {
public static void main(String[] args) {
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
jaxWsServerFactoryBean.setAddress("http://localhost:8081/cxf_server");
jaxWsServerFactoryBean.setServiceClass(LoginServiceImpl.class);
Server server = jaxWsServerFactoryBean.create();
server.start();
System.out.println("server start");
}
}
生成客户端代码
跟上面一样生成
Axis 解析 WebService
首先下载Axis-1.4, 然后解压, 地址: https://archive.apache.org/dist/ws/axis/1_4/
在bat文件中填入一下指令:
set axis_lib=E:\360\axis-bin-1_4\axis-1_4\lib //这里填入解压后Axislib的路径
set java_cmd=java -Djava.ext.dirs=%axis_lib%
set axis_servlet=http://localhost:8081/cxf_server?wsdl
%java_cmd% org.apache.axis.wsdl.WSDL2Java -u %axis_servlet%
pause
调用示例:
public class TestDemo {
public static void main(String[] args) throws Exception {
LoginServiceImplServiceLocator loginServiceImplServiceLocator = new LoginServiceImplServiceLocator();
LoginServiceImplServiceSoapBindingStub bindingStub = new LoginServiceImplServiceSoapBindingStub(new URL(loginServiceImplServiceLocator.getLoginServiceImplPortAddress()),new
org.apache.axis.client.Service());
System.out.println(bindingStub.sayHello());
}
}
总结一下
在刚开始写的时候,总是想一股脑将WebService的相关东西全部写完, 但是后来一看全部写完这一篇就太长了,对阅读的人也是一种负担。索性就还是进行拆分吧,初遇篇我们着重在会用,理解WebService的概念,以及简单的使用类库发布服务和调用服务。相识篇我们讲进阶一点的应用。