侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Restful风格

coydone
2022-03-21 / 0 评论 / 0 点赞 / 330 阅读 / 4,977 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-10,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

REST定义

REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,比如Web应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。

它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。

Restful的特性

优点:它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。

它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。

表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。

比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。

状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。

HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT、DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

使用Restful风格

在 Spring 3.0 以后,Spring 这对 SpringMVC 的一些增强功能对 RESTful 提供了良好的支持。在4.0后的版本中,Spring支持以下方式创建REST资源:

  1. 控制器可以处理所有的HTTP方法,包含几个主要的REST方法:GET、POST、PUT、DELETE、PATCH;

  2. 借助 @PathVariable 注解,控制器能够处理参数化的URL(将变量输入作为URL的一部分);

  3. 借助Spring的视图解析器,资源能够以多种方式进行表述,包括将模型数据渲染为XML、JSON、Atom、以及 RSS 的 View 实现;

  4. 可以使用 ContentNegotiatingViewResolver 来选择最适合客户端的表述;

  5. 借助 @ResponseBody 注解和各种 HttpMethodConverter 实现,能够替换基于视图的渲染方式;

  6. 类似地,@RequestBody 注解以及 HttpMethodConverter 实现可以将传入的HTTP数据转化为传入控制器处理方法的Java对象;

  7. 借助 RestTemplate,Spring 应用能够方便地使用 REST 资源。

@PathVaribale注解

作用:用于绑定URL中的占位符。

例如:请求URL中 /delete/{id},这个{id}就是URL占位符。

URL支持占位符是 Spring3.0 之后加入的。是SpringMVC支持REST风格URL的一个重要标志。

属性:value:用于指定URL中占位符名称;required:是否必须提供占位符。

<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
    
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
	System.out.println(id);
	return "success"; 
}

使用简化的注解

@RequestMapping(value = "/user/", method = RequestMethod.GET)
此时可以使用@GetMapping("/user/")来简化这两个注解。
同理,请求方式不同,对应注解也不同:@PostMapping、@PutMapping、@DeleteMapping

使用 @RequestBody 注解实现在请求体中接收资源状态

使用 @RequestBody 注解可以告知Spring查找一个消息转换器,将来自客户端的资源表述转换为对象。如:

@RequestMapping(value = "/save", method = RequestMethod.POST, 
				produces = { "application/json;charset=UTF-8" })
public int saveEmploy(@RequestBody EmployeeEntity employeeEntity) {
    return empService.save(employeeEntity);
}

使用 @RestController 注解为控制器默认设置消息转换

Spring 4.0 引入了 @RestController 注解,在控制器是用 @RestController 代替 @Controller 的话,Spring 将会为该控制器的所有处理方法应用消息转换功能。我们不必在每个方法都添加 @ResponseBody 注解了。

为客户端提供其他元数据

使用ResponseEntity提供更多响应相关的元数据

可以利用 ResponseEntity 给客户端返回状态码、设置响应头信息等,如给客户端提供返回码:

@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = { "application/json;charset=UTF-8" })
 public ResponseEntity<EmployeeEntity> employById(@PathVariable long id) {
   HttpStatus status = null;
   EmployeeEntity employeeEntity = empService.selectById(id);
   if (employeeEntity != null) {
     status = HttpStatus.OK;
   } else {
     status = HttpStatus.NOT_FOUND;
   }
   return new ResponseEntity<EmployeeEntity>(employeeEntity, status);
 }
//如果没有if判断,当根据id找不到对应的信息的时候,返回给客户端的状态码是默认的HttpStatus.OK;
//当加上了判断条件后如果没有相应的信息返回则设置返回状态码为HttpStatus.NOT_FOUND,
//最后通过new一个ResponseEntity会将查询信息和状态码一起返回到客户端。

过滤器支持PUT和DELETE请求

<!--restful风格过滤器-->
<filter>
  <filter-name >hiddenHttpMethodFilter</filter-name>
  <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name >hiddenHttpMethodFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

RestTemplate API

RestTemplate定义了36种与REST资源交互的形式(其实只有11个独立的方法,10个被重载了3次,另外一个被重载了6次),其中大多数都对应于HTTP的方法。

大多数HTTP方法都以三种方法进行了重载:

//1. 一个使用String作为URL格式,并使用可变参数列表指明URL参数。
//url参数指定访问的地址,
//responseType参数定义该方法的返回类型,
//urlVariables参数为url中占位符对应的参数。
getForObject (String url, Class responseType, Object... urlVariables)

//2. 一个使用String作为URL格式,并使用Map指明URL参数。
//在该函数中,使用Map类型的urlVariables替代上面数组形式的urlVariables,
//因此使用时在url中需要将占位符的名称与Map类型中的key一一对应设置。
getForObject(String url, Class responseType, Map urlVariables)

//3. 一个使用java.net.URL作为URL格式,不支持参数化URL;
//使用URI对象来替代之前的url和urlVariables参数使用。
getForObject(URI url, Class responseType)

RestTemplate定义了11个独立的操作,而每一个都有重载,这样一共是36个方法 :

  • postForEntity() :POST数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的。

  • postForLocation() :POST数据到一个URL,返回新创建资源的URL。

  • postForObject() :POST数据到一个URL,返回根据响应体匹配形成的对象。

需要注意的是新增加的 request 参数,该参数可以是一个普通对象,也可以是一个 HttpEntity 对象。

如果是一个普通对象,而非 HttpEntity 对象的时候,RestTemplate会将请求对象转换为一个 HttpEntity 对象来处理,其中Object就是request的类型,request内容会被视作完整的body来处理;如果 request 是一个HttpEntity对象,那么就会被当作一个完成的 HTTP 请求对象来处理,这个 request 中不仅包含了 body 的内容, 也包含了 header 的内容。

postForObject(String url, Object request, Class responseType, Map uriVariables)

  • delete() :在特定的URL上对资源执行HTTP DELETE操作。

  • put() :PUT资源到特定的URL。

  • getForEntity() :发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象。

  • getForObject() :发送一个HTTP GET请求,返回的请求体将映射为一个对象。

  • headForHeaders() :发送HTTP HEAD请求,返回包含特定资源URL的HTTP头。

  • optionsForAllow() :发送HTTP OPTIONS请求,返回对特定URL的Allow头信息。

  • exchange() :在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的。

  • execute() :在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象。

在实际的开发中一般使用Web Services和SpringMVC相结合的方式。

0

评论区