【java】--SpringMVC 的RestFul 接口

理解REST

        REST(Representational State Transfer),中文翻译叫“表述性状态转移”。是 Roy Thomas Fielding 在他2000年的博士论文中提出的。它与传统的 SOAP Web 服务区别在于,REST关注的是要处理的数据,而 SOAP 主要关注行为和处理。要理解好 REST,根据其首字母拆分出的英文更容易理解。
    表述性(Representational):对于 REST 来说,我们网络上的一个个URI资源可以用各种形式来表述,例如:XML、JSON或者HTML等。
    状态(State):REST 更关注资源的状态而不是对资源采取的行为。
    转移(Transfer):在网络传输过程中,REST 使资源以某种表述性形式从一个应用转移到另一个应用(如从服务端转移到客户端)。

    具体来说,REST 中存在行为,它的行为是通过 HTTP 表示操作的方法来定义的即:GET、POST、PUT、DELETE、PATCH;GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,PATCH用来更新资源。 基于 REST 这样的观点,我们需要避免使用 REST服务、REST Web服务 这样的称呼,这些称呼多少都带有一些强调行为的味道。

使用 springMVC 支持 RESTful

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

  • 控制器可以处理所有的 HTTP 方法,包含几个主要的 REST 方法:GET、POST、PUT、DELETE、PATCH;
  • 借助 @PathVariable 注解,控制器能够处理参数化的 URL(将变量输入作为 URL 的一部分);
  • 借助 spring 的视图解析器,资源能够以多种方式进行表述,包括将模型数据渲染为 XML、JSON、Atom、已经 RSS 的 View 实现;
  • 可以使用 ContentNegotiatingViewResolver 来选择最适合客户端的表述;
  • 借助 @ResponseBody 注解和各种 HttpMethodConverter 实现,能够替换基于视图的渲染方式;
  • 类似地,@RequestBody 注解以及 HttpMethodConverter 实现可以将传入的 HTTP 数据转化为传入控制器处理方法的 Java 对象;
  • 借助 RestTemplate ,spring 应用能够方便地使用 REST 资源。

创建 RESTful 控制器


代码清单

@Controller
@RequestMapping("/employs")
public class EmployeeController {
  @Autowired
  private EmployeeService empService;
  @GetMapping(value = "/list", produces = { "application/json;charset=UTF-8" })
  public List<EmployeeEntity> employs(Integer offset,Integer limit) {
    offset = offset == null ? 0 : offset;
    limit = limit == null ? 20 : limit;
    return empService.queryEmployList(offset,limit);
  }
}
      代码的大致过程是当客户端发起对 “/employs” 的 GET 请求时,将调用服务端的 employs 方法,服务端通过注入的 EmployeeService 获取到一个 EmployeeEntity 列表,并将列表以 JSON 的表述形式返回给客户端。

           需要注意的是这里控制器本身并不关心资源如何表述。控制器以 Java 对象的方式来处理资源。控制器完成了它的工作以

后,资源才会被转化成为适合客户端的形式。spring 提供了两种方法将资源的 java 表述形式转化为发送给客户端的表述形式:

  • 内容协商(Content negotiation):选择一个视图,它能够将模型渲染为呈现给客户端的表述形式;
  • 消息转化器(Message conversion):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。

     对于上述两种方式,第一种方式是通过 ContentNegotiatingViewResolver 作为 ViewResolver 的实现,主要是用于将资源渲

染用户接口所需要的视图模型,如:HTML、JSP等也可以渲染。也可以针对不是客户端产生 JSON 或 XML,但是效

果不是很理想,往往会产生一些不是客户端所需要的预期结果。如:客户端希望得到的响应可能是

{“name”:”zhangs”,”age”:”20”}。而模型是 key-value 组成的 map ,可能最终的响应是这样的:{“user”:

{“name”:”zhangs”,”age”:”20”}}。基于内容协商的这些限制,这里我们主要讨论第二种方式:使用 Spring 的消息转换功能来生成

资源表述。

使用 HTTP 消息转换器

      这是一种更为直接的方式,消息转换器能够将控制器产生的数据转换为服务于客户端的表述形式。常用的一些消息转换器如:Jackson 的 MappingJacksonHttpMessageConverter 实现 JSON 消息和 Java 对象的互相转换; JAXB 库的 Jaxb2RootElementHttpMessageConverter 实现 XML 和 Java 对象的相互转换等。

通过 @ResponseBody 注解实现响应体中返回资源状态。

      正常情况下,当处理方法返回 Java 对象时,这个对象会放在模型中并在视图中渲染使用。但是,如果使用了消息转换功能的话,我们需要告诉 Spring 跳过正常的模型/视图流程,并使用消息转换器。实现这种方式最简单的方式是在控制器的方法上添加 @ResponseBody 注解。如:
@GetMapping(value = "/list", produces = { "application/json;charset=UTF-8" })
@ResponseBody
public List<EmployeeEntity> employs(Integer offset,Integer limit) {
  offset = offset == null ? 0 : offset;
  limit = limit == null ? 20 : limit;
  return empService.queryEmployList(offset,limit);
}
   这里 @ResponseBody 注解会告知 Spring 将 List 转换成 JSON 这样的表述形式作为资源发送给客户端。

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


   使用 @RequestBody 注解可以告知 Spring 查找一个消息转换器,将来自客户端的资源表述转换为对象。如:
@PostMapping(value = "/employ", produces = { "application/json;charset=UTF-8" })
public int saveEmploy(@RequestBody EmployeeEntity employeeEntity) {
  return empService.save(employeeEntity);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值