- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
16.2 创建第一个 REST 端点
借助Spring的支持来实现REST功能有一个很有利的地方,那就是我们已经掌握了很多创建RESTful控制器的知识。从第5章到第7章中,我们学到了创建Web应用的知识,它们可以用在通过REST API暴露资源上。首先,我们会在名为SpittleApiController的新控制器中创建第一个REST端点。
如下的程序清单展现了这个新REST控制器起始的样子,它会提供Spittle资源。这是一个很简单的开始,但是在本章中,随着不断学习Spring REST编程模型的细节,我们将会不断构建这个控制器。
程序清单16.1 实现RESTful功能的Spring MVC控制器
让我们仔细看一下程序清单16.1。你能够看出来它服务于一个REST资源而不是Web页面吗?
可能看不出来!按照这个控制器的写法,并没有地方表明它是RESTful、服务于资源的控制器。实际上,你也许能够认出这个spittles()方法,我们曾经在第5章(5.3.1小节)见过它。
我们回忆一下,当发起对“/spittles”的GET请求时,将会调用spittles()方法。它会查找并返回Spittle列表,而这个列表会通过注入的SpittleRepository获取到。列表会放到模型中,用于视图的渲染。对于基于浏览器的Web应用,这可能意味着模型数据会渲染到HTML页面中。
但是,我们现在讨论的是创建REST API。在这种情况下,HTML并不是合适的数据表述形式。
表述是REST中很重要的一个方面。它是关于客户端和服务器端针对某一资源是如何通信的。任何给定的资源都几乎可以用任意的形式来进行表述。如果资源的使用者愿意使用JSON,那么资源就可以用JSON格式来表述。如果使用者喜欢尖括号,那相同的资源可以用XML来进行表述。同时,如果用户在浏览器中查看资源的话,可能更愿意以HTML的方式来展现(或者PDF、Excel及其他便于人类阅读的格式)。资源没有变化——只是它的表述方式变化了。
注意:
尽管Spring支持多种资源表述形式,但是在定义REST API的时候,不一定要全部使用它们。对于大多数客户端来说,用JSON和XML来进行表述就足够了。
当然,如果内容要由人类用户来使用的话,那么我们可能需要支持HTML格式的资源。根据资源的特点和应用的需求,我们还可能选择使用PDF文档或Excel表格来展现资源。
对于非人类用户的使用者,比如其他的应用或调用REST端点的代码,资源表述的首选应该是XML和JSON。借助Spring同时支持这两种方案非常简单,所以没有必要做一个非此即彼的选择。
按照我的意见,我推荐至少要支持JSON。JSON使用起来至少会像XML一样简单(很多人会说JSON会更加简单),并且如果客户端是JavaScript(最近一段时间以来,这种做法越来越常见)的话,JSON更是会成为优胜者,因为在JavaScript中使用JSON数据根本就不需要编排和解排(marshaling/demarshaling)。
需要了解的是控制器本身通常并不关心资源如何表述。控制器以Java对象的方式来处理资源。控制器完成了它的工作之后,资源才会被转化成最适合客户端的形式。
Spring提供了两种方法将资源的Java表述形式转换为发送给客户端的表述形式:
内容协商(Content negotiation):选择一个视图,它能够将模型渲染为呈现给客户端的表述形式;
消息转换器(Message conversion):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。
鉴于我们在第5章和第6章中已经讨论过视图解析器,并且已经熟悉了基于视图的渲染(在第6章中),所以首先看一下如何使用内容协商来选择视图或视图解析器,它们将资源渲染为客户端能够接受的形式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论