首先我们要知道什么是RestFul:
简单来说Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
首先我们来看一看restFul风格和传统风格操作资源的差别
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
使用RESTful操作资源
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
明显可以看出restFul风格要简洁很多
其实现在很多大厂都是使用的这种风格。比如京东:
接下来我们就来了解下restful的来龙去脉吧
Step1
我们每天都要吃早餐
今天早上8点30我们到了一加早餐店对服务员说来一碗津市牛肉粉,然后找了个位置坐下来等粉来。
这个点餐的过程我们如果用Json数据来描述就可以是下面这个样子的。
{
"addOrder"::{
"orderName":"牛肉粉"
}
}
我们通过这个Json数据表示我们需要添加一个订单,内容是牛肉粉,之后我们可以收到一个牌子上面写着17
{
“orderId”:”17”
}
之后我们就可以坐在位置上等服务员来送餐了。
不过现在我们假设一下我们现在有一张会员卡,想查询一下会员卡还省多少钱,这个时候我们可以发送这一串Json 地址是 数据是
{
“getBalance”::{
"carId"::"8088"
}
}
查询卡号为你8088的余额,我们可以收到这样一串回传信息
{
"balance":0
}
没钱。 现在跟老板说,这个粉我不要了,
{
“deleteOrder”:{
"orderId":"17"
}
}
然后出门买了俩包子
这样子的请求方式就相当于我们当初学习JSP和Servlet的单一资源的请求方式了。
如果对于用户量大一些的场景肯定不适用
Step2
接下来我们来修改一下
我们将订单作为一个模块 会员卡作为一个模块
1.添加订单
/order
{
"addOrder"::{
"orderName"::"牛肉粉"
}
}
2.删除订单
/order
{
"deleteOrder":{
"orderId":"17"
}
}
3.查询余额
/cards
{
"getBalance":{
"cardId":"8088"
}
}
Step3
接下来老板还想继续优化,他发现负责处理订单的员工,每次都要去订单内容里面看是新增订单还是删除订单,还是其他的什么操作,十分不方便,于是规定,所有新增资源的请求,都在请求上面写上大大的‘POST’,表示这是一笔新增资源的请求” 删除订单 在请求上面写上一个"DELETE",表示这是一个删除订单的请求。获取资源则在请求上面写上“GET”表示这是一个获取资源的请求。
现在,让我们来点一碗牛肉粉。
POST/orders
{
"orderName":"牛肉粉"
}
现在请求就简单多了,不用告诉老板是addOrder 看到是Post请求就知道是新增了。
接着是查询和删除
GET/cards
{
"cardId":"8088"
}
还可以优化一下
GET /card/8088
删除可以是这样
DELETE /orders/17
接下来我们还是通过代码来看看如何实现一个Rest风格吧
使用RESTful风格开发的接口,根据id查询商品,接口地址是:
http://127.0.0.1/item/1 查询商品id为1的商品
我们需要从url上获取商品id,步骤如下:
使用注解@RequestMapping("item/{id}")声明请求的url
{xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”
使用(@PathVariable() Integer id)获取url上的数据
如果@RequestMapping中表示为"item/{id}",id和形参名称一致,@PathVariable不用指定名称。如果不一致,例如"item/{ItemId}"则需要指定名称@PathVariable("itemId")。
http://127.0.0.1/item/123?id=1
注意两个区别
@PathVariable是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)
如果加上@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据。如果不加,就走视图解析器,返回页面
网友评论