背景:
网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备…)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现"APIFirst"的设计思想。RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。
什么是 Restful
REST(Representational State Transfer)表述性状态转换,REST指的是一组架构约束条件和原则。 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。
引用 REST 创建者 Roy Fielding:
“REST 提供了一套架构约束,当应用作为整体时,其强调组件交互的可扩展性、接口的通用性、组件的独立部署以及中间组件,以减少交互延迟、实施安全性和封装传统系统。” — Roy Fielding,《架构风格与基于网络的软件架构设计》
基于SpringMVC 实现Restful
jsp页面:
<a href="${pageContext.request.contextPath }/queryFrui/${fruit.id}">查询</a>
Controller:
Spring mvc可以使用@RequestMapping的路径设置,结合@PathVariable的参数指定,来实现RESTful风格的请求。
样例要实现,通过拼接水果商品的id来实现一个RESTful风格的请求,并向后台发送该请求,以此来获取JSON格式的水果数据
@RequestMapping(value="/queryFruit/{id}",method={RequestMethod.GET})
@ResponseBody
public Fruits getFruitById(Model model,@PathVariable("id") Integer fruitId) throws Exception{
Fruits fruit = fruitsServices.queryFruitById(fruitId);
return fruit;
}
HTTP协议类型表达资源操作
HTTP协议里的8种方法,及其他衍生方法,常用的Get、post可以间接的实现其余所有的操作,根据框架和浏览器的兼容性选择性使用。
- GET(SELECT):从服务器取出资源(一项或多项),即是查询。
-
POST(CREATE):在服务器新建一个资源,添加。
-
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
-
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
-
DELETE(DELETE):从服务器删除资源
-
HEAD:获取资源的元数据。
-
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
-
TRACE:回显服务器收到的请求,主要用于测试或诊断。
-
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
-
MOVE: 请求服务器将指定的页面移至另一个网络地址。
-
COPY: 请求服务器将指定的页面拷贝至另一个网络地址。
-
LINK: 请求服务器建立链接关系。
-
UNLINK: 断开链接关系。
-
WRAPPED: 允许客户端发送经过封装的请求。
-
Extension-mothed:在不改动协议的前提下,可增加另外的方法。
返回结果应该包含状态码
-
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
-
201 CREATED -[POST/PUT/PATCH]:用户新建或修改数据成功。
-
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
-
204 NO CONTENT - [DELETE]:用户删除数据成功。
-
400 INVALID REQUEST -[POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
-
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
-
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
-
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
-
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
-
410Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
-
422Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
-
500INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
get Demo
@RequestMapping(value="/products",method= {RequestMethod.GET})
public List<Product> products()
{
List<Product> products = new ArrayList<>();
for (int i = 0; i < 6; i++) {
Product p = new Product(i, "name" + i);
products.add(p);
}
return products;
}