BSTEK Development Framework2(BDF2) : 8.1.Webservice原理

      前面说过,BDF2-WEBSERVICE是基于Spring-WS构建,所以如果您了解Spring-WS的开发流程,那么,一切就很容易实现。反之,如果您不了解Spring-WS或不太理解Webservice的运行原理,那我们建议您先去了解一下。这里在开始开发一个Webservice之前,我们建议您去w3school上学习一下XSD语法WSDL语法,熟悉这两种类型的XML对于我们开发基于Spring-WS的Webservice来说是必须的,同时它也会帮助我们理解Webservice的整个运行原理,总之有百利而无一害。不要害怕学习,w3school上关于这两种类型XML的教程写的非常好,也非常简单,先去学习一下吧。

      从零开始学习Webservice开发并不是BDF2-WEBSERVICE的责任,但这里我们也会简单介绍一下Webservice运行原理,要想更为深入的学习Webservice,大家还需要去好好研究它的规范才行。

      我们知道,Webservice主要特点是跨平台,也就是我们通过JAVA暴露的Webservice可能通过Java的客户端调用,也可以通过.net或php的客户端调用,反之亦然。应该说,这一点是吸引我们使用Webservice最重要的原因,那它是怎么实现这种跨平台调用的呢?

      Webservice规则通过传输固定格式的XML来解决跨平台调用问题,那就是在用户请求目标Webservice时,需要将请求的内容包装成一个特定的XML格式:SOAP,也就是简单对象访问协议,这是一个特定基于XML格式的消息协议。调用客户端将消息封装成SOAP格式的XML,通过标准的HTTP协议向目标Webservice发送一个标准的post请求,请求的内容就是这个封装好的SOAP格式的XML消息。Webservice服务端在收到这个客户端提交上来的POST请求之后,会将请求的XML内容以一个SOAP格式进行解析,在解析并获取到客户端请求的SOAP格式的XML消息之后,接下来,Webservice服务端需要知道服务端的哪个类哪个方法可以接受并响应这个请求。

      一般来说,Webservice服务端有两种方式用于匹配具体的用于响应Webservice服务的类及方法:一个是根据请求的SOAP消息的XML的root的节点名称及其采用的namespace;一个是根据从SOAP消息的header中取出的SOAPAction的值(对于Spring-WS来说,这两种方法都支持),一旦找到了匹配的响应Webservice服务的类及方法,那么它会检查这个服务是否需要基于WS-Security的认证,如果需要,那么它会尝试从这个SOAP的header中获取相关认证信息,在通过认证之后,按照匹配的响应Webservice服务的类及方法的要求,将SOAP格式的XML消息的body部分解析成相应的参数对象,交由匹配的响应Webservice服务的类及方法去执行处理。方法处理完成之后,如果有响应,那么Webservice服务端会将响应的结果反序列化成一个标准的SOAP格式的XML,再这个XML回写到客户端,客户端再对取到的SOAP格式的响应结果进行解析,从而完成整个Webservice调用。

      可以看到,Webservice服务的请求与响应的内容皆以XML格式为载体,我们知道XML是一种跨平台的消息传递格式,所有平台都可以对其进行解析、处理,所以Webservice也就可以进行跨平台调用。到目前为止,我们还没有涉及到WSDL,实际上Webservice服务本身与WSDL并无关系,WSDL的全称是Webservice描述语言,也就是说WSDL是用来描述目标Webservice是什么样的,用来告诉我们的客户该怎么调用这个Webservice的。所以我们完全可以把WSDL理解成是某个Webservice服务的说明文档或者是帮助文档,没有这个WSDL,我们的Webservice服务照样可以正常运行,也就是说WSDL存在与否不会对Webservice服务产生任何影响。但对于我们程序员来说,暴露的Webservice是给我们调用的,所以我们必须学会看懂WSDL,不然就不知道如何调用目标Webservice,这也是我们开篇强调学习WSDL的重要原因。

      开篇除了强调学习WSDL之外,我们还强调学习XSD,其实对于标准的Webservice而言是不需要了解XSD的,但我们这里强调学习XSD的原因是其可以帮助我们编写WSDL文件。了解了WSDL之后,会发现其语法较为复杂,手工编写起来难度很大,所以Spring-WS为我们提供了另外一种选择,那就是通过编写XSD来代替WSDL,Spring-WS会帮我们将XSD动态转换成WSDL,相比WSDL,编写XSD要简单许多。

      Webservice开发有两种模式:一种称之为contract-first;另一种是contract-last。关于这两种模式的优劣,Spring-WS官方文档作了大篇幅的讨论,感兴趣可以去看看,这里就不再赘述了。Spring-WS采用的是contract-first模式,相比contract-last有众多优势,具体大家可以看到Spring-WS官方文档。

      对于Spring-WS来说,基于contract-first模式开发Webservice首先要做的第一件事就是确定我们的WSDL,也就是把要把编写的目标Webservice描述清楚:其中包含请求当中应该包含哪些信息、响应当中应该包含哪些信息、应该采用什么样的namespace等。所以这里的WSDL相当于我们软件开发当中的需求文档,把需求文档写清楚了,程序员才知道如何编写具体的业务代码,只是这里的需求文档是WSDL,是一个XML文件,除此之外,它与需求文档的在本质完全相同。

      例子是最好的教程,接下来我们就来编写一个Webservice,并用SOAPUI来测试其是否可使用,按照Spring-WS的contract-first模式,我们首先来编写一个用于描述Webservice内容的WSDL,这里其实就是编写一个XSD文件。