SpringMVC 构建 RESTful 风格的资源交互(返回 Json / Xml 格式数据资源)

1. 返回什么

RESTful 风格在后台服务端来看:我们不需要再返回一个类似于JSP的页面,我们只需要返回数据资源的内容,纯数据,不含任何显示信息。

简单的来说就是,我们只需要返回 Json、Xml、RSS、图片等消息或者媒体

2. SpringMVC 的支持

使用 @ResponseBody@RequestBody 启用 消息转换器,从而取代默认的视图解析器。

实际上也有一个内容协商器 ContentNegotiatingViewResolver 不过该方式不推荐使用。

SpringMVC 提供了多种消息转换器,满足了对常见消息的转换需要。

依据 URL 扩展名,或客户端请求头中的 Accept 属性,或指定的资源格式,来返回相应的资源格式。

3. Controller 配置实例

Controller:

@Controller
@RequestMapping("/rest")
public class RestController {
    @Autowired
    private Dao dao;

    @RequestMapping(value = "/get/{name}")
//    @RequestMapping(value = "/get/{name}", produces = "application/json")
//    @RequestMapping(value = "/get/{name}", produces = "application/xml")
    @ResponseBody
    public Spitter get(@PathVariable String name) {
        Spitter spitter = dao.find(name);
        return spitter;
    }
}

Spitter:

@XmlRootElement
public class Spitter {
    private String username;
    private String password;
    private String fullname;
    private String email;
    private boolean updateByEmail;
    public Spitter() {
    }
    //省略 setter getter...
}

测试可以使用 Junit 和 MockMvc 进行。

代码解读:

  • 依赖于消息转换器,使用 @ResponseBody 注解以启用,将告知Spring返回的对象作为资源(非HTML视图)返回给客户端。

  • 注解@RequestBody 类似作用找到一个对应的消息转换器。

  • 转换器:

    • Json – MappingJackson2HttpMessageConverter
    • Xml – Jaxb2RootElementHttpMessageConverter
  • 若要支持返回Xml格式,需要返回的JavaBean上使用JAXB注解@XmlRootElement等,该依赖已经集成在JDK中。

  • 若要支持返回Json格式,需要引入 jackson-core jackson-databind 依赖。

  • 支持客户端以url扩展名 url.xml url.json 方式请求也支持客户端在请求头的Accept属性配置application/json application/xml

  • url形式优先级高于Accept属性。

  • 注解@RequestMapping 的 produces属性 不指定则根据请求头的Accept属性application/json application/xml 返回对应Content-Type属性的格式。

  • 注解@RequestMapping 的 produces属性 指定则返回无限制的请求头或者对应限制的请求头的Accept属性,返回对应Content-Type属性的格式。

  • 若@RequestMapping限制请求头的Accept属性application/json,客户端请求时使用url.xml请求,不论Accept属性如何设置均获取不到资源,因为优先级较高的url.xml资源不存在

  • 无限制请求返回的格式优先检测是否使用了JAXB注解@XmlRootElement,如使用则返回XML格式,否则再返回Json格式。

  • 若要指定使用XML格式,并且不想使用JAXB:

    • 1.需要在spring配置文件中手动配置好视图解析器,并在Controller中显示的声明ModelAndView,并new ModelAndView(“视图解析器Bean”)后返回该视图

    • 2.按照自己喜欢的方式构建Xml字符串,将构建后的字符串通过 @ResponseBody 注解所选定的消息转换器直接返回。

可以使用 @RestController 代替 @Controller ,这样就不需要在当前 Controller 中每个方法都添加 @ResponseBody 了。

4. 参考链接

Spring in Action(第4版),沃尔斯(Craig Walls), 第16章

发表评论

发表回复

*

沙发空缺中,还不快抢~