1 什么是Restful
资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
示例
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 删除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account
2 SpringMVC对RESTful的支持
- @PathVariable:可以解析出来URL中的模板变量,例如{id}
- 设置@RequestMapping的method属性设置,可以将同一个url映射到不同的handlerMethod上
- 直接使用@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等同与@ResquestMapping+Method方法设置
3 Demo
3.1 准备工作
因为我前后台交互数据采用的json格式,需要导入fastJson依赖,注册json消息转换器
两个与前台交互的json对象
//lombok注解,省略了set和get
@Data
public class JAccount {
String id;
boolean status;
public JAccount(String id, boolean status) {
this.id = id;
this.status = status;
}
}
@Data
public class JId {
String id;
public JId(String id) {
this.id = id;
}
}
3.2RestfulController
测试post,delete,put
@Controller
public class RestfulController {
Logger logger = Logger.getLogger(RestfulController.class);
@PostMapping(value = "accout")
@ResponseBody
public JId post(@RequestBody JAccount jAccount ){
return new JId(jAccount.getId());
}
@DeleteMapping(value = "accout/{id}")
@ResponseBody
public void deleteAccout(@PathVariable String id){
logger.info("delete id:"+id);
}
@PutMapping(value = "accout/{id}/{status}")
@ResponseBody
public JAccount updateAccout(@PathVariable String id,@PathVariable boolean status){
return new JAccount(id,status);
}
}
3.3 hello.jsp
需要导入jquery
<div>
<button onclick="restPost()">Restful Post</button>
<script type="text/javascript">
function restPost(){
$.ajax({
type:"post",
url:'${pageContext.request.contextPath }/accout',
data:'{id:"restPost",status:1}',
contentType:"application/json;charset=utf-8",
dataType:"json",
success:function(result){
alert("id:"+result.id);
}
});
}
</script>
</div>
<p></p>
<div>
<button onclick="restDelete()">restful delete</button>
<script type="text/javascript">
function restDelete(){
$.ajax({
type:"delete",
url:'${pageContext.request.contextPath }/accout/111',
success:function(){
alert("delete success !");
}
});
}
</script>
</div>
<p></p>
<div>
<button onclick="restPut()">restful Put</button>
<script type="text/javascript">
function restPut(){
var id ="restPut";
var status=1;
$.ajax({
type:"put",
url:'${pageContext.request.contextPath }/accout/'+id+"/"+status,
dataType:"json",
success:function(result){
alert("name:"+result.id+"\n status:"+result.status);
}
});
}
</script>
</div>