使用Spring MVC创建REST API

以信息为中心的表述性状态转移(Representational State Transfer,REST)已经成为替换传统SOAP Web服务的流行方案。SOAP一般关注行为和处理,而REST关注要处理的数据。
REST面向资源,将资源的状态以最适合客户端或者服务端的形式从服务端转移到客户端。
创建REST API,HTML并不是合适的数据表达式,资源表述应当首选XML和JSON。

Spring中的RESTful特性
Spring提供了两种方法将资源的Java表述形式转换为发送给客户端的表述形式。
1.内容协商:选择一个视图,它能够将模型渲染为呈现给客户端的表述形式
2.消息转换器:通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式
消息转换提供了一种更为直接的方式,它能够将控制器产生的数据转换为服务于客户端的表述形式,当使用消息转换功能时,DispatcherServlet不再需要那么麻烦将模型传送到视图中。实际上这里根本没有模型,也没有视图,只有控制器产生的数据。以及消息转换器转换数据只有所产生的资源表述。
客户端通过请求的Accept头信息表明它能接受"application/json",并且Jackson JSON在类路径下,那么处理方法返回的对象交给MappingJacksonHttpMessageConverter,并由它转换为返回客户端的JSON表达形式。

在响应体中返回资源状态
正常情况下,当处理方法返回Java对象,这个对象会放在模型中并在视图中渲染使用,但是,如果使用了消息转换功能的话,我们需要告诉Spring跳过正常的模型/视图流程,并且使用消息转换器。最简单的方法是为控制器方法添加@ResponseBody注解

@RequestMapping(method=RequestMethod.GET,produce="application/json")
public @ResponseBody List<Spittle> spittles(){
}

@ResponseBody注解会告知Spring,我们要返回的对象作为资源发送给客户端,并将其转换为客户端可接受的表述形式,更具体地将,DispatcherServlet将会考虑到请求header中Accept头部信息,并查找到能够为客户端提供所需表述形式的消息转换器。
当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。
produces属性表明这个方法只处理预期输出为JSON的请求。也就是说,这个方法只会处理Accept头部信息包含"application/json"的请求。其他任何类型的请求,即使它的URL匹配指定的路径并且时GET请求也不会被这个方法处理。这样的请求会被其他的方法进行处理或者返回客户端HTTP406(Not Acceptable)响应。

在请求体中接受资源状态
REST API也可以接受来自客户端的资源表述。@RequestBody能够告诉Spring查找一个消息转换器,将来自客户端的资源表述转换为对象。

@RequestMapping(method=RequestMethod.GET consumes="application/json")
public @RequestBody Spittle saveSpittle(@RequestBody Spittle spittle){
}

Spittle参数使用了@RequestBody,所以Spring将会查看请求中的Content-Type头部信息可能时"application/json",DispatcherServlet会查找能将JSON转换为Java对象的消息转换器。
consumes属性关注请求的Content-Type头部消息,它会告诉Spring要求请求的Content-Type头部信息为"application/json"。如果不满足这些条件,将会由其他方法来处理请求。

为控制器默认设置消息转换
Spring4.0引入@RestController注解来替代@Controller,会为该控制器的所有处理方法应用消息转换功能,不必为每个方法都添加@ResponseBody

发送错误信息到客户端
使用ResponseEntity
控制器方法可以返回一个ResponseEntity对象,ResponseEntitiy中可以包含响应相关的元数据(如头部信息和状态码)以及要转化成资源表述的对象


WillLiaowh
71 声望8 粉丝

世界上最伟大的力量是坚持。