初识rest风格api

本着对rest的学习,记录下学习的心得。

首先什么是rest

用我的话说就是他是一个无状态的url或者说是uri对应服务器上的一个资源,使用http的post(增),delete(删),put(改),get(查)来标记请求的动作。再简单点就是用url来标记资源位置,用http来描述动作。

样例

服务器中可以用springMVC的注解@pathVariable来获得url的资源位置,例如http://example/v1/user/123中,可以使用@pathVariable来获得123这个标记,在springMVC的@requestMapping注解中除了使用value属性来映射请求地之外,可以加上method属性来标记这个方法对应http请求的哪种操作。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Controller
@RequestMapping("rest")
public class Rest {

@RequestMapping(value="source",method=RequestMethod.PUT)
@ResponseBody
public String sourcePut(){
String msg = "this is put";
return msg;
}

@RequestMapping(value="source",method=RequestMethod.POST)
@ResponseBody
public String sourcesPost(){
String msg = "this is post";
return msg;
}
}

在这段代码中,如果请求地址为http://example/rest/source,使用put发送请求,那么最终执行到的是sourcePut这个方法,如果使用post发送请求,那么最终执行到的是sourcePost这个方法。

上边是比较简单的实现方式,对于rest,还可以举出两个例子来说明什么是rest

  • 第一个例子,客户端如果在阅读有分页的文章,那么他向服务器发送的的请求为“我想查看下一页”,然后服务器返回下一页,客户端再次发送“我想查看下一页”,服务器依然会执行下一页,在这个例子中,服务器是保存客户端状态的,这不是rest,rest的服务器是不会保存用户状态的,也就是说,服务器是不会相应“我想查看下一页”这种请求的,客户端需要自己去维护状态,并向服务器发送资源地址去请求下一页。
  • 第二个例子是在人员管理系统中,如果想获得张三的工资,必须先登录系统,点击个人,再点击工资查询,才能获得张三的工资,那么,如果其中缺啥一步,就不能获得张三的工资,也就是说,没有一个唯一的资源路径能够直接获得张三的工资,而rest的接口,直接会给定一个路径去访问张三的工资(暂时可以这么说,其他方面暂不考率)。

通过上边两个例子,可以大致了解rest的含义,使用rest也会好处,系统扩展性会强,由于使用的是资源地址,如果浏览器允许缓存的话,可以直接加载缓存,不用再访问服务器了。

参考资料:https://www.zhihu.com/question/28557115 (这是一个知乎问题,里面的回答都很受用)