REST

社会在发展,时代在进步。人们日常使用的电子产品也从个人电脑发展到平板电脑,智能手机,智能手表,智慧屏,等等。这些电子产品装有各种各样的系统,各种各样的系统装有各种各样的软件,各种各样的软件需向后台服务器请求各种各样的资源,各种各样的资源在各种各样的系统里又有各种各样的表现形式。比如,同样是淘宝订单,当用浏览器查看时,订单就以网页的形式表现;当用手机淘宝APP查看时,订单就以手机淘宝APP的形式表现。

毫无疑问,计算机是处理数据的机器。因此,计算机的核心总是数据。在计算机看来,各种各样的前台终端向后台服务器请求的各种各样的资源都是数据。前台终端拿到后台服务器的数据之后,理应根据自身的特点表现这些数据。比如,如果前台终端是浏览器,则以HTML的形式表现这些数据;如果前台终端是鸿蒙系统,则以鸿蒙系统用户界面的形式表现这些数据;如果前台终端是IOS系统,则以IOS系统用户界面的形式表现这些数据。由此可见,后台服务器仅向前台终端响应一份HTML是不合时宜的。毕竟HTML在浏览器上表现非常容易,在手机上以手机系统用户界面的形式表现就难免让人发疯了。

因此,后台服务器最好只向前台终端响应一份数据,比如一份JSON格式的数据。这样,如果前台终端是浏览器,则可操纵HTML把数据填进网页进行表现;如果前台终端是鸿蒙系统,则可调用鸿蒙系统用户界面API进行表现;如果前台终端是IOS系统,则可调用IOS系统用户界面API进行表现。于是,同样一份数据就能在不同的前台终端以不同的形式完美表现了。

基于这样的思考,前后台分离的开发方式出现了,风靡了,流行了。后台开发人员大可不必关心前台是怎样实现的,只需写好API供前台调用之后响应一份数据给前台就行。前台开发人员同样不必关心后台是怎样实现的,只需调用后台API拿到数据之后以前台终端支持的方式进行表现就行。于是,一种新的编程思想出现了,这种编程思想就是REST。

REST又称REST API,RESTful,RESTful API,是英文REpresentational State Transfer的缩写,中文通常翻译成表述性状态转移,一个抽象到让人摸不着头脑的术语。值得庆幸的得,REST本身并没有“表述性状态转移”这样的术语那样难以理解。毕竟REST只是一种编程思想,阐述了面向数据的后台API应该怎么实现。为了理解REST这种编程思想,让我们以庖丁解牛的手法拆开REST,瞧瞧里头都有哪些东西。只是拆开之前,我们还需知道人们提到表述性状态转移时总会习惯性地说漏一个词,这个词就是资源。因此,表述性状态转移的完整叫法应是资源表述性状态转移(Resource REpresentational State Transfer),能被拆成这样:
1.资源(Resource)
 资源就是数据。
2.表述性(REpresentational)
 表述性是资源的表述方式。比如,同一份数据既可以用JSON表述,也可以用XML表述。
3.状态(State)
 状态是指资源的状态。常用的HTTP请求方法有GET,POST,DELETE,PUT,PATCH,等等。简单来说,这些HTTP请求方法就是资源的状态。
4.转移(Transfer)
 转移是指资源的转移。也就是说,资源是流动的。既可从前台流向后台,也可从后台流向前台。资源的转移可以简单地理解为数据的流动。

可以看到REST是围绕资源展开的。资源,也就是数据,是REST的核心。前台向后台发起请求之后,后台响应给前台的应是以某种方式表述的数据。至于前台收到数据之后如何表现则是前台自己的事了。比如,前台收到后台一份以JSON这种格式进行表述的数据之后,能以HTML的形式表现这些数据,把数据渲染成一张好看的网页;也能以鸿蒙系统用户界面的形式表现这些数据,把数据渲染成鸿蒙系统风格的用户界面。

同时我们也注意到了,前台向后台发起的请求是带有状态的。这个状态就表现在HTTP请求方法上。当前台用GET这种HTTP请求方法向后台请求获取数据时,请求是带有GET状态的;当前台用POST这种HTTP请求方法向后台请求新增数据时,请求是带有POST状态的;当前台用DELETE这种HTTP请求方法向后台请求删除数据时,请求是带有DELETE状态的;当前台用PUT或PATCH这种HTTP请求方法向后台请求修改数据时,请求是带有PUT或PATCH状态的。因此,请求由两部分组成:一部分是请求URL;一部分是请求状态。请求URL指定了资源的位置;请求状态指定了请求的行为,也就是请求是用于获取数据的,新增数据的,还是删除数据的,等等。

由此可见,REST描述的是数据应以某种状态某种表述方式在前后台之间转移的编程思想。后台实现的API只要符合这种编程思想就是REST。因此,REST既可采用Spring MVC这种技术进行实现,也可采用诸如.NET,PHP,Python之类的技术进行实现。本书介绍的是Spring,自然应该关注怎样使用Spring MVC这种技术实现REST。基于这样的目的,让我们紧接前文实现的person项目,看看改用REST能够怎么实现。而这,可从控制器的修改开始。

按照前文的实现,控制器返回的是ModelAndView对象。ModelAndView对象保存的是关于数据模型和视图名的信息,而REST风格的控制器应该只需返回数据。因此,ModelAndView对象已经不合时宜了,我们需对ControlPersonInfo控制器做些修改,如下:

 1 package com.dream.controller;
 2 
 3 import java.util.*;
 4 import org.springframework.stereotype.*;
 5 import org.springframework.beans.factory.annotation.*;
 6 import org.springframework.web.bind.annotation.*;
 7 import org.springframework.web.context.request.*;
 8 import com.dream.service.*;
 9 
10 @Controller
11 public class ControlPersonInfo {
12     private ServicePersonInfo servicePersonInfo = null;
13 
14     @Autowired
15     public void setServicePersonInfo(ServicePersonInfo servicePersonInfo) {
16         this.servicePersonInfo = servicePersonInfo;
17     }
18 
19     @ResponseBody
20     @RequestMapping(value = "/person_info", method = RequestMethod.GET)
21     public List<ServicePersonInfoResult> visit(WebRequest request) {
22         return this.servicePersonInfo.process();
23     }
24 }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » REST