Demo下载地址:http://download.youkuaiyun.com/detail/jmkfly/7925365
·SOA(Service-Oriented Architecture) 面向服务框架:
是一种思想,它将应用程序的不同功能单元,通过中立的契约(独立于硬件平台、操作系统和)联系起来。
使得各种形式的功能单元个更好地集成。
·目前来说,WebService是SOA的一种较好的实现方式。
WebService采用HTTP作为传输协议,SOAP(Simple Object Access Protocol) 作为传输消息的格式。
但WebService并不是完全符合SOA的概念,因为SOAP协议是WebService的特有协议,并未符合SOA(面向服务框架)的传输协议透明化的要求。
简单的说,一个Web Service就是一个能够使用XML消息通过网络来访问的接口,这个接口描述了一组可访问的操作。
一个Web Service的特征是:
由SOAP和WSDL包装的对象;适应松散耦合的网络环境,可通过Web服务,手段是SOAP消息;
服务的行为、输入、输出都可以使用WSDL描述。
·SOAP: SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,
是一个基于XML的协议,它包括四个部分:
SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;
SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;
SOAP绑定(binding),使用底层协议交换信息。
·WSDL: Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML语言。
·UDDI: 是Universal Description, Discovery, and Integration的缩写。
简单说,UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。
·SOA的产生经历过程:
·通常采用SOA的系统,叫做服务总线(Bus),结构如下:
Server公开Web服务,Client调用Web服务。
JAX-WS的服务端、客户端,双方传输数据使用的SOAP消息格式封装数据。
实际上SOAP信封内包装的就是一段XML代码。
·Java中的三种Web服务规范:
-JAX-WS (Java API for XML-WebService):
JAX-WS (JSR224) 规范的API位于javax.xml.ws.*包,其中大部分都是注解,提供API操作Web服务。
通常在客户端使用较多。
WS-MetaData (JSR181) 是JAX-WS的依赖规范,其API位于javax.jsw.*包,
使用注解配置,公开的Web服务的相关信息和,配置SOAP消息的相关信息。
-JAXM&SAAJ (Java API for XML-Message, SOAP With Attachment API for Java):
JAXM(Java API for XML Message)主要定义了发送和接收消息所需的API,
相当于Web服务的服务器端,其API位于javax.messaging.*包。
SAAJ(SOAP with Attachment API for Java, JSR67) 是与JAXM搭配使用的API,
为构建SOAP包,和解析SOAP包提供重要的支持,支持附件传输,
它在服务器、客户端都需要使用。其API位于javax.xml.soap.*包。
JAX-WS与JAXM&SAAJ都是基于SOAP的Web服务,相比JAXM&SAAJ编码比较麻烦,
JAX-WS隐藏了更多细节,更加面向对象,实现起来你基本不需要关心SOAP的任何细节。
如果你想控制SOAP消息的更多细节,可以使用JAXM&SAAJ。
-JAX-RS (Java API for REST):
JAX-RS是Java针对REST(Representation State Transfer)风格制定的一套Web服务规范,
其API位于javax.ws.rs.*包。
【注意】:
JAX-WS和JAX-RS规范,我们采用Apache CXF作为实现。
CXF是Object Celtix和Codehaus XFire合并而成。
CXF的核心是org.apache.cxf.Bus(总线),类似于Spring的ApplicationContext。
Bus由BusFactory创建,默认是SpringBusFactory类,可见默认CXF是依赖于Spring的。
Bus都有一个ID,默认的BUS的ID是cxf。
需要注意的是:
Apache CXF 2.2的发行包中的jar,如果直接全部放到lib目录,那么必须使用JDK1.6,
否则会报JAX-WS版本不一致的问题。
对于JAXM&SAAJ规范,我们采用JDK中自带的默认实现。
·WSDL(WebService Definition Language)文件结构:
<wsdl:definitions>
<wsdl:types></wsdl:types>
<wsdl:message></wsdl:message>
……
<wsdl:portType></wsdl:portType>
<wsdl:service></wsdl:service>
<wsdl:binding></wsdl:binding>
</wsdl:definitions>
·Web服务只向客户端暴露WSDL,客户端必须将WSDL转换为自己的编程语言书写的代码。
JAX-WS的各种实现都提供相应的工具进行WSDL与JAVA之间的互相转换。
你可以在CXF的运行包中找到bin目录,其中的wsdl2java.bat可以将WSDL转换为JAVA类。
但要注意JAVA类转换为WSDL最好使用前面的URL?wsdl的方式获得,因为这样得到的是最准确的。
常用方式:
wsdl2java -p com.liam.client -d F:\clientsrc http://localhost:8090/MyService/helloService?wsdl
1. JAX-WS规范、SOAP
·SOAP信息消息格式:
-使用日志拦截器 LoggingInInterceptor(), LogginOutInterceptor().
Inbound Message-服务器端接收到的SOAP信息
Outbound Message-服务器端响应的SOAP信息
-格式例子:
*****
INFO: Inbound Message
----------------------------
ID: 1
Address: /helloService
Encoding: UTF-8
Content-Type: text/xml; charset=UTF-8
Headers:{…}
Payload:<soap:Envelope ....>....</soap:Envelope>
----------------------------
*****
-Payload(有效负荷,也叫净荷):
Payload的XML就是SOAP消息的真正内容。
SOAP消息内容被封装为<soap:Envelope…><soap:Body>…</soap:Body></soap:Envelope>,称之为SOAP信封。
在信封之间的内容就是SOAP消息正文。
如果某些注解的header=true,那么它将被放到<soap:Header>中传输,而不是SOAP消息正文。
<soap:Envelope…><soap:Header>…</soap:Header><soap:Body>…</soap:Body></soap:Envelope>
2. JAX-RS规范、REST(Java的WebService规范JAX-RS)
·REST: Representation State Transfer
·REST是一种软件架构模式,只是一种风格。
也可说,REST是基于HTTP协议的软件架构。
它不像SOAP那样,SOAP本身承载着一种消息协议。
·REST协议中重要的两个概念:(HTTP协议恰好完整地提供了这两个要点)
-资源定位:
HTTP协议中的URI可以完成资源定位
-资源操作:
HTTP协议中的GET, POST, PUT, DELETE, HEAD请求报头 可以完成资源操作
·REST提供的网络服务叫做OpenAPI。
它不仅把HTTP作为传输协议,也把HTTP作为数据处理工具。
·区别:
-REST完全依赖HTTP协议就可以完成Web服务。(REST轻量级,充分利用了HTTP协议的特性,简单易用、效率高。)
访问REST风格的Web服务很简单,不需要像SOAP使用SDK生成客户端代码。
-SOAP协议只利用了HTTP的传输特性,定位与操作由SOAP协议自身完成。(SOAP笨重,成熟度较高、安全性较好。)
·**这里插入代码(以后有空了补充,Demo下载地址:http://download.youkuaiyun.com/detail/jmkfly/7925365 )**
·为了更加好地使用HTTP访问REST服务,建议使用Apache HttpComponents-Client组件进行HTTP操作。
·Response接口有两个静态的内部类:
ResponseBuilder
ResponseBuilder用于创建Response实例,
Response先通过自己的方法(ok(), status(), notModified()等)获得ResponseBuilder实例
然后ResponseBuilder进行构建
最后使用ResponseBuilder的build()方法返回Response实例,也就是构建完毕。
Status
用于获取响应状态码。
·JAX-RS注解参数处理:
可以使用一个一个字符串的传递,也可以直接使用复合类型。
@QueryParam 获取查询参数
@PathParam 获取路径参数
@MatrixParam 获取Matrix参数
@FormParam POST方式提交的参数
@HeadParam HTTP请求头中的参数
@CookieParam Cookie参数
@DefaultValue 用于对上面6个注解设置在未取到值的情况下的默认值
@Encoded 用于对禁用前4种注解的自动解码
·REST路径命名习惯:
最顶层的根@Path的路径要以/开头。
不是根@Path的不要以/开头,如果其后还有子路径被递归嵌套,那么以/结尾。
·使用WebClient类:
使用CXF自带的org.apache.cxf.jaxrs.client.WebClient更加简单。
WebClient client = WebClient.create(“http://localhost:8090/student/1”);
Student student = client.path(“info/matrix;id=2;name=jmk”).accept(“application/xml”).get(Student.class);
3. WS-*规范:
基于SOAP的Web服务的WS-*规范不下几十种。
目前CXF支持如下几种WS-*规范:
1)WS-Addressing
实现与底层传输协议的隔离,寻址方式采取基于消息的路由,同时也实现了对会话状态的保存机制。
2)WS-Reliable Messaging
实现了可靠的消息传递,也就是保证消息从发送者正确传输到接受者。
3)WS-Security和WS-Policy、WS-Trust
实现了SOAP服务的安全策略、信任机制。
·WSS4J:
Apache WSS4J (WebService Security For Java),实现了Java语言的WS-Security。
WSS4J支持的验证模式:
XML Security
-XML Signature
-XML Encryption
Tokens
-Username Tokens
-Timestamps
-SAML Tokens
代码部分
SOAP/JAX-WS规范:(需要wsdl2java生成客户端代码)
1) Without Spring: com.liam.WebService.SOAPjaxWs.NonSpring
2) With Spring: com.liam.WebService.SOAPjaxWs.WithSpring
REST/JAX-RS规范:
1)Withou Spring: com.liam.WebService.RESTjaxRs.NonSpring
2)With Spring: com.liam.WebService.RESTjaxRs.WithSpring