360SDN.COM

Spring Rest 精华一页纸

来源:一页纸世界  2017-09-11 13:27:04    评论:0点击:

Rest 也算是 WebService,并不是一种什么新的协议。而是一种规范,一种编码规范和约束。 RestFul一种 基于有状态资源 的Web处理方式。
所有的交互,都回归本质, 只是简单使用了普通格式的数据。对比RPC、RPS(WebService),也没有使用桩Stub 和框架Skeleton进行调用,而是直接交互数据。这种方式,最大的优点就是简洁,而且不同语言间进行简单处理就可以实现交互。

1、RestFul


Representational -- Rest 资源可以用各种形式进行表述,比如Json/XML/HTML 等,这点和基于SOAP 的RPC不同,虽说 SOAP 是简单协议,但比起Rest还是重量了一点。
State -- Rest 更关注资源的状态,而不是对资源采取的行动
Transfer - Rest 把数据以一种表述性形式从一个应用转移到了另一个应用,即把资源以某种 形式 从服务端转移到了客户端,或者反之

RestLess的 URL地址 http://localhost:8080/servlet/displayObject.htm?id=123
RestFul 的 URL地址 http://localhost:8080/servlet/object/123

可以看出两者的区别,RestLess 是面向动作,面向操作;而ResultFul 是面向资源,至于资源要做的动作,从URL中无法看到(在HTTP方法中体现)
RestLess 的URL,并没有定位资源,只是一个查询参数 ;RestFul的URL 定位到一个资源,至于定位到这个资源做什么,由HTTP 方法决定

ResultFul 定位资源也正常本地定位资源一样也是有目录层级的

HTTP的方法
GET - 获取资源,幂等
PUT - 传送资源,幂等
DELETE - 删除资源,幂等
POST - 传输,不幂等

2、JAX-RS


JavaEE 6 提供了对Jax-RS的规范jsr-311的支持
JavaTM API for RESTful WebServices
定义了一些接口和 标注/注解

I、URL 资源路径映射
@Path 用在类和方法上
a、对于 CRUD 和 create和update资源,只需要定位到资源的上一级即可,此时对客户端POST和PUT来的数据,允许使用一个实体参数对象,没有做任何参数的绑定;
b、对于Read和Delete则需要定位到具体的资源,这时对路径参数就需要有特殊处理:
首先@Path标注的路径,需要使用匹配方式 {id},占位符的方式。
@Path("/person/{id:\\d+}/") 可以使用正则表达式进行匹配,也可以直接使用 {id}可以把各种原先用在querString上的参数放到资源请求中去,比如
@Path("/accounts/{beginDate:\\d{4}-\\d{2}-\\d{2}},{endDate:\\d{4}-\\d{2}-\\d{2}}/")

II、参数绑定
@PathParam("id") 用在方法的参数上。 修饰入参,绑定入参;绑定的参数对象id就是path里面的占位参数。

III、操作类型指定
@PUT @GET @POST @DELETE 用在方法上。分别对应 CRUD 操作。

IV、内容协商与数据绑定
@Producers 和 @Conusmers 用在方法上:@Producers 标注用于指定响应体的数据格式(MIME 类型),@Consumes 标注用于指定请求体的数据格式;作为客户端,Accept 请求头用于选择响应体的数据格式,Content-Type 请求头用于标识请求体的数据格式。

一般用来交换的数据都是 XML 和 JSON格式,数据映射,最后需要通过JAXB等第三方包来完成 XML/JSON 和JAVA对象的映射。
支持的数据类型(包括请求参数和相应体,即双向数据交换) 有原生类型/ List、Set等集合/对象等等。对于响应还有一些HTTP对应的状态码,比如DELETE没有返回实体。只有状态码。

@Path("/")
public class BookkeepingService {
......
@Path("/person/")
@POST
@Consumes("application/json")
public Response createPerson(Person person) {
......
}

@Path("/person/{id:\\d+}/")
@DELETE
public Response deletePerson(@PathParam("id")
int id) {
......
}

@Path("/person/{id:\\d+}/")
@GET
@Produces("application/json")
public Person readPerson(@PathParam("id")
int id) {
......
}

@Path("/persons/")
@GET
@Produces("application/json")
public Person[] readAllPersons() {
......
}

@Path("/person/{name}/")
@GET
@Produces("application/json")
public Person readPersonByName(@PathParam("name")
String name) {
......
}

3、基于Spring MVC 的Rest集成


既然是基于MVC,那其他的使用方式都是一样的。映射到Controller进行处理。

重点在两个地方:
I、如何识别URL 参数的映射?
a、映射参数还是和MVC一样,只不过路径同规范一样使用了占位符
@RequestMapping(method = RequestMethod.GET, value = "/employee/{id}")
b、参数绑定,使用了自带的 @PathVariable
@PathVariable String id

II、数据如何交互?
POST 请求数据使用 @RequestBody进行绑定。 @RequestBody Employee employee
而 通常SpringMVC Controller处理完以后,就是要转到一个 页面模版;而Rest基本就是返回一个数据集。原先的方式肯定不行,解决方式
返回状态码,针对Update Delete @ResponseStatus(HttpStatus.NO_CONTENT)
返回数据内容,针对Create/Reade @ResponseBody

那 Rest的数据怎么和对象/类型对应起来,规范中有Producers和Consumers?
Spring提供了两种方式:
a、内容协商

<!--Use JAXB OXM marshaller to marshall/unmarshall following class-->
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>dw.spring3.rest.domain.Employee</value>
</list>
</property>
</bean>
<!-- 指定处理 -->
<bean id="employees" class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg ref="jaxbMarshaller" />
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" />

返回的视图命名为 employees ,使用的是bean名称处理器,即调用了MarshallingView ,最终jaxb2 把数据Emploee数据解析成 XML 返回给Client浏览器。
对于输入的@RequestBody再做一下数据转换处理???
这里是约定了XML规范的,如果未知规范的,则使用 ContentNegotiatingViewResolver把各种 accept 类型做配置进去。

b、Http信息转换器
Spring提供了非常多的类型转换器;支持XML/JSON 等各种常见的转换。只需要配置一个转换器,则代码中,直接使用@RequestBody @ResponseBody,由系统自动转换。

<!--To enable @RequestMapping process on type level and method level-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
</bean>

III、Rest客户端
此外,Spring还提供了Rest客户端的访问。客户端本质就是一个HTTP请求,使用HttpClient可以很方便的调用(使用socket发送HTTP报文也可以)。
RestTemplate(类似JDBCTemplate)提供了Put/Get/Post/Delete 等多个方法的使用。只需要把URL和对象传入即可。如果需要传输客户端对象的话,还需要提供一个Class对象,由RestTemplate进行转换。(默认转换成XML 发给Rest服务端)

4、框架Restlet/Jersey


和Spring差不多,定义了Servlet 分发,实现了一系列的接口
这里面有一个例子
http://www.tuicool.com/articles/IfUb6vb

阅读原文

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权