概念:RESTful架构:是一种设计的风格,并不是标准,只是提供了一组设计原则和约束条件,也是目前比较流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
1.他会对url进行规范:
a) 非REST风格的url:localhost:8080/springmvc?userName=aa&password=bb;
b) REST风格的url:localhost:8080/springmvc/aa/bb;
优点:
简洁、安全
所有的url都可以当成是资源
2.对http的方法进行规范
a)不管是删除,添加,更新….使用的url都是一致,那么如果需要删除,就把http的方法设置删除
b) 控制器:通过判断http的方法来执行操作(增删改查)
目前这种做法还没有被广泛采用
3.对contentType也进行规范
a) 就是在请求是指定contentType的类型(json交互中就有体现)
4.接下来看看springMVC中怎么实现RESTful风格
首先:你在请求路径上@RequestMapping(value = "/hello_rest/{name}/{password}")需要用{}来动态匹配参数
其次:方法的形参上要@PathVariable("name")来匹配上面的参数,这里@PathVariable中的字符串必须和你{}中的名字一致
访问路径:localhost:8080/工程名/hello_rest/xx/xx(其中xx就是你随便填写的内容,它会匹配到后台的name和password的值)
比如:
你输入的路径是:localhost:8080/hello/aa/admin
后台会匹配到:userName="aa",password="bb"
/**
* 1.路径的变化:/hello/{name}/{password}其中{}相当于可以的参数
* 2.参数的写法:需要利用@PathVariable("name")来匹配上面的参数
* 3.至于@PathVariable后面跟的形参你就可以随便命名了
* @param userName
* @param password
* @return
*/
@RequestMapping(value = "/hello/{userName}/{password}")
public String hello_rest(@PathVariable("userName") String userName,
@PathVariable("password") String password) {
if("admin".equals(userName)&"123".equals(password)){
System.out.println("登录成功");
return "hello";
}
return "hello";
}
这种写法和第一种类似,只不过是把{}动态匹配参数的放到前面去了,其原理是一样的,不多说,直接看看这个访问路径的写法就好
访问路径:localhost:8080/xx/xx/hello
只是把参数由后面放到前面去了而已。
/**
* 1.路径的变化:/{userName}/{password}/hello_rest其中{}相当于可以的参数
* 2.参数的写法:需要利用@PathVariable("userName")来匹配上面的参数
* 3.至于@PathVariable后面跟的形参你就可以随便命名了
* @param userName
* @param password
* @return
*/
@RequestMapping(value = "/{userName}/{password}/hello")
public String hello_rest2(@PathVariable("userName") String userName,
@PathVariable("password") String password) {
if("admin".equals(userName)&"123".equals(password)){
System.out.println("登录成功");
return "hello";
}
return "hello";
}
Rest,它的全称是Representational State Transfer,翻译过来是表现层或者说是表象性的的状态转换。提到这个不得不说一下软件开发的三层架构
通常意义上的三层架构就是将业务应用划分成:表现层,业务逻辑层,数据访问层。
1). 表现层: 应用中唯一用户可见的层,即用户界面
2). 业务逻辑层: 对业务逻辑的处理,对数据层的操作
3).数据访问层: 对于数据库的操作,包括增、删、改、查。当然了,数据访问层不仅仅访问数据库还可以访问二进制文件,XML文档等。
那这里的表现层或者表象指的又是怎么样的一个表现呢?其实这个表现指的是资源的表现,最终展现出来的资源结果。
所谓的资源和我们平常理解的一样,比如朋友推荐给我们一部好看的电影,我们经常会问朋友,哎,有没有资源?这就是我们所说的,不管是电影,文本,还是音乐,都可以被称为资源。那我们要怎么去查找到这个资源呢?
这是我们就要引入一个概念,叫做URI。统一资源标识符(Uniform Resource Identifier),它是一个用于标识某一互联网资源名称的字符串,简单来说URI就是资源所在的位置,后端将资源发布为URI,前端通过URI访问资源,接下来并通过HTTP动词表示要对资源进行的操作,就是Rest中所说的状态转换。
综上所述,我们在后端进行增删改查,将处理的结果返回给前端,处理的结果就是我们说的资源。
Restful对数据格式没有限制,就算你用的是XML或者其他格式都可以,但是大部分会选择是返回json字符串。
用一小段代码解释一下
@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据
Value中的值就是我们说的URI
Get操作就是我们用的HTTP动词来让状态装换。
//@GetMapping相当于是 @RequestMapping(method = RequestMethod.GET)
@GetMapping(value = "/json")
public @ResponseBody List<Hero> getUserInfo(){
List<Hero> heroes = heromapper.getAllHeros();
return heroes;
}
我们可以看到前端返回的是这样的json字符串的结果。
我们看到地址中的http://localhost:8877/templates/json
同理我们根据带参数的ID查询也是如此。
这里我们要注意带参数的Controller
如果@RequestMapping中表示为”getUserById/{id}”,id和形参名称一致,@PathVariable不用指定名称。如果不一致,例如”getUserById/{id}”则需要指定名称@PathVariable(“id”)。
@RequestMapping(value = "/getUserById/{id}" ,method = RequestMethod.GET)
public @ResponseBody Hero getUserInfo(@PathVariable() Integer id ){
Hero hero = heromapper.selectByPrimaryKey(id);
return hero;
}
我们看一下它的地址
现在我们知道了rest是一种面向资源服务的API设计方式,可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http的动词决定的。 rest请求方法有4种,包括get,post,put,delete.分别对应获取资源,添加资源,更新资源及删除资源.
那为什么现在我们要用Restful这种风格去设计我们的API呢?
我们来说一下REST的优点和特征。
其一:我们以API为界限进行解耦首先就是为了分离前后端
RESTful API 就可以通过一套统一的接口为所有客户端提供web服务,实现前后端分离。
还有一点就是REST是无状态的,换句话说,服务器端不能存储来自某个客户的某个请求中的信息,并在该客户的其他请求中使用。
所谓无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。有状态和无状态的区别,举个简单的例子说明一下。
如查询英雄的攻击力,如果查询是需要登录系统,进入查询的页面,执行相关操作后,获取攻击力的多少,则这种情况是有状态的,因为查询英雄攻击力的每一步操作都依赖于前一步操作,只要前置操作不成功,后续操作就无法执行;
如果输入一个url即可得到指定英雄的攻击力,则这种情况是无状态的,因为获取英雄攻击力不依赖于其他资源或状态,且这种情况下,英雄攻击力是一个资源,由一个url与之对应,可以通过HTTP中的GET方法得到资源,这是典型的RESTful风格。
其三:返回有用的错误信息(message)
恰当地理解和返回Http Status(状态码)。200=成功,404=资源不存在,500=服务器端错误等等
综合以上所说,大家应该对restful风格的流行有了感触吧,Restful好就好在它可以最大程度的隔离操作,不会使关联操作互相受影响,它的URL是一致的,不会混乱。
但是要真正学会Rest还有很长的路要走。