今天的文章将涵盖有关REST在Spring中的基本问题。 这对于新手程序员特别有用。
来自Pivotal 的官方指南 ,其中介绍了准备主题。

Spring REST是Spring MVC的一部分。 因此,许多Spring MVC将在REST中使用,反之亦然。 要更深入地了解Spring MVC,请阅读本文 。
REST是做什么的?要了解REST的概念,您需要将首字母缩略词解析为其组成部分:
- 表示形式-REST中的资源可以以任何形式表示-JSON,XML,文本甚至HTML-取决于哪种数据更适合使用者
- 状态-使用REST时,您应该专注于资源的状态,而不是针对资源的操作
- 传输-REST包括将资源数据以任何呈现的形式从一个应用程序传输到另一个应用程序。
REST是服务器和客户端之间的资源状态转移。
什么是资源?REST中的资源就是可以在客户端和服务器之间传输的所有资源。
以下是一些资源示例:
- 最新消息
- 圣彼得堡周一凌晨4点的温度
- 员工工资
- 数据库选择
- 搜索结果
CRUD代表什么?REST中的操作由http方法确定。
Get
, Post
, Put
, Delete
, Patch
等。
最常用的缩写是CRUD:
- 创建
POST
- 阅读-
GET
- 更新
PUT
- 删除-
DELETE
REST安全吗? 你怎么能保护他?默认情况下,REST是不安全的。
您可以使用基本身份验证,JWT,OAuth2配置安全性
。
什么是幂等运算? 幂等为什么重要?幂等方法是每次调用都会得到相同结果的方法。
也就是说,在这种方法的1次调用之后的结果将与10次此方法的调用之后的结果相同。
这对于容错API很重要。 假设客户端要使用POST请求更新资源? 如果POST不是幂等方法,则多次调用将导致意外的资源更新。 使用幂等方法可以保护自己免受许多错误的侵害。
REST伸缩性好吗?是的 REST可伸缩,因为它不存储状态。
这意味着它不会在服务器上存储用户会话信息。
客户信息不应存储在服务器端,而应每次都发送到需要的地方。 这就是ST在REST(状态转移)中的含义。 您传递状态,而不是将其存储在服务器上。
REST也可以互操作-这意味着以不同语言编写的不同程序可以在其上进行交互。 这来自两个因素:
- 可互操作的HTTP客户端。 不同的客户端必须发送相同的http请求。
- 媒体类型级别的互操作性。 不同的客户端必须正确发送和接收相同的资源。
什么是HttpMessageConverter?HttpMessageConverter
将请求转换为对象,反之亦然。
Spring具有此接口的几种实现,您可以创建自己的接口。
在这种情况下, DispatcherServlet
不使用模型和视图。
在REST中,根本不存在模型和视图。 当消息从媒体类型(json,xml ...)转换为对象时,仅由控制器提供的数据和资源的表示形式。
转换器列表:
BufferedImageHttpMessageConverter
将BufferedImageHttpMessageConverter
转换为图像代码。
Jaxb2RootElementHttpMessageConverter
将xml转换为带有jaxb2批注的对象(来自)。 如果jaxb2在类路径中,则进行注册。
MappingJackson2HttpMessageConverter
将JSON转换为对象。 如果Jackson 2在类路径中,请注册。
StringHttpMessageConverter
将所有媒体文件转换为文本/纯文本。
@RestController批注如何工作?@RestController
放置在控制器类上,而不是@Controller
。 她指出,此类并非在模型上运行,而是在数据上运行。 它由@Controller
和@RequestBody
。
@Controller @ResponseBody public interface RestController
为什么使用@ResponseBody?@ResponseBody
放置在处理数据而不是模型的方法上。 如果使用@RestController
无需显式指定。
常规方法返回Model
,带注释的@ResponseBody
方法返回使用HttpMessageConverter
转换为媒体文件的HttpMessageConverter
。
@RequestMapping注释有什么作用?该注释用于将请求映射到控制器类和方法。
以前,它用于类方法以指示URI,http方法,发送的数据类型等。 在较新版本的Spring中, @GetMapping
其替换为注释@GetMapping
, @PostMapping
等。
现在,它仅用于指示控制器类的URI。
什么是@ GetMapping,@ PostMapping,@ DeleteMapping和其他注释?这些是用于映射http方法的较窄注释。
@GetMapping
处理请求@PostMapping
处理帖子请求@DeleteMapping
处理删除请求@PutMapping
处理放置请求@PatchMapping
处理补丁请求
下面写的所有内容都是其他注释的特征。
注释@GetMapping只是一个包含@RequestMapping(方法= RequestMethod.GET)的注释。
它还允许您微调处理程序方法。
其参数(将它们转换为类似的@RequestMapping参数):
为什么使用@RequestParam批注?使用此注释,以便处理程序方法可以从http请求中获取参数。
带有参数的请求: http://localhost:8080/getByName/name=Ivan
。
以下代码会将字符串Ivan
放入变量name
。
@GetMapping("getByName") public User getUserByName(@RequestParam("name") String name) {
为什么使用@PathVariable批注?该注释从URI中获取特定部分。
URI: http://localhost:8080/getById/23
以下代码将23
放入id
变量中。
@GetMapping("getById/{id}") public User getUserById(@PathVariable("id") String id) {
http响应的不同代码意味着什么?GET-200 OK
POST-200 OK,创建201,204无内容
PUT-200确定,201创建,204无内容
删除-204无内容,202被接受
为什么需要@ResponseStatus批注?它允许您设置响应代码。 通常,Spring本身会设置所需的响应代码,但是有时您需要重写它。
@PostMapping @ResponseStatus(HttpStatus.CREATED) public void add(...) {...}
除了使用批注,您还可以返回ResponseEntity
并手动设置响应代码。
不建议同时使用ResponseEntity
和@ReponseStatus
。
什么是ResponseEntity?这是代表http响应的特殊类 。 它包含响应主体,状态代码,标头。 我们可以使用它来微调http响应。
它是一种通用类型,任何对象都可以用作主体:
@GetMapping("/hello") ResponseEntity hello() { return new ResponseEntity("Hello World!", HttpStatus.OK); }
为什么使用@RequestBody?您可以在方法参数上使用@RequestBody
批注,以便将请求正文转换为该参数。
@PostMapping("accounts")
您可以将@Validated
和@RequestBody
一起使用以检查请求。
什么是RestTemplate? 它有什么优势?RestTemplate是Spring中用于发送http请求的特殊客户端。 它提供了方便的API,可轻松在一行上调用REST端点。
RestTemplate restTemplate = new RestTemplate(); String fooResourceUrl = "http://localhost:8080/spring-rest/foos"; ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
您可以在本文中了解有关用法的更多信息。