REST是一种用于构建存在交互行为的分布式异构系统(heterogeneous systems)的架构风格,Spring对REST的支持是建立在SpringMVC基础上的, 最重要的概念是resource,可以通过Uniform Resource Identifier (URI)标识,比如对于一个博客空间来说,它的资源就包括post, comment和user。
resource也可以是一个集合, 表示资源集合,比如, the URI http://www.myblog.com/posts/ 可以包含 0个或者多个Post resources, 每个都有它自己的URI。
对一个资源可以有不同的操作,这个操作可以被表达为一个URI 和相应的HTTP 方法(GET, POST, PUT, DELETE, 等等)。
比如下面就是一些资源操作:
资源操作的例子
最常用的数据交换格式 (ContentTypes)是JSON 和 XML。
基于SpringMVC的REST endpoint 和普通SpringMVC 控制器的区别:
GET区别:image.png
POST区别:
image.png
注意:如果Controller里面全部是REST endpoints,则@ResponseBody可以直接放到类上,更进一步@Controller + @ResponseBody 可以用@RestController替代
例子:
1. 新建一个工程


2. 增加3个实体类
请注意:Post类里面有一个List<Comment>,而Comment类里面有一个Post,即存在双向关联,这会导致JPA marshaling将会无限循环并导致 StackOverflow。解决之道是在back reference加上@JsonIgnore ,即在Comment类中的Pos成员上加上@JsonIgnore; 也可以用@JsonManagedReference修饰Post里面的List<Comment>,用@JsonBackReference修饰Command中的Post(两个Annotation都要用上)。
Note The @JsonManagedReference annotation is used to indicate that the annotated property is part of a two-way linkage between fields and that its role is as a "parent" (or "forward") link. The @JsonBackReference
annotation is also used to indicate that the associated property is part of a two-way linkage between fields, but its role is as a "child" (or "back") link.



3. 增加JPA



4. 自定义异常类

5. 定义控制器



5. 用POSTMAN去测试

6. 用RestTemplate写代码来测试
6.1 增加一个数据库脚本

6.2 增加测试用例



6.3 Run as Junit Test

提醒:前面提到双向依赖可能导致的堆栈溢出问题,见下面的测试:

7. 跨域资源共享(Cross-Origin Resource Sharing)
基于安全因素的考虑,浏览器不允许对驻扎在当前域之外的资源发送AJAX请求。CORS specification提供了一种方法可以指明哪个跨域请求是允许的。SpringMVC为REST API endpoints的CORS提供了支持,所以API 的消费者,比如web clients和mobile devices就能调用REST API。
image.png
一般几种方法:
- 类级别的@CrossOrigin
- 方法级别的@CrossOrigin
- 全局CORS配置(见下图):
全局CORS配置




