1:什么是REST风格
-
REST(Representational State Transfer)即表述性转移 ,RESTful(REST风格) 架构是一种软件设计风格,提供了一组设计原则和约束条件,是目前非常流行的一种软件架构风格。 Spring MVC 也提供对这种风格的支持。
-
REST 风格:用 URL 表示资源,用 HTTP 方法 (GET-查、POST-增、PUT-改、DELETE-删) 表示对资源的操作。 URL 中最明显的就是参数不再使用“?”传递 。
-
REST 风格优缺点:
-
优点:URL 可读性更好,项目架构清晰 ,资源安全性更高。
-
缺点: 由于中文乱码的问题,URL 参数传递中文时可读性就比较差。
-
# 传统 URL 请求 /esho/UserController?m=addUser&name=admin&pwd=123 /eshop/UserController/addUser.do?name=admin&pwd=123 /eshop/UserController/addUser?name=admin&pwd=123 # REST 风格请求 /eshop/user/1 GET /eshop/user/admin/123 POST /eshop/user/admin/123 PUT /eshop/user/1 DELETE
-
2:怎么使用REST风格
配置PUT和DELETE
由于 HTTP 不支持 PUT 和 DELETE 请求,所以需要将 POST 请求转化为 PUT 请求和 DELETE 请求,在 web.xml
中配置 SpringMVC 过滤器 HiddenHttpMethodFilter
。
<!-- HiddenHttpMethodFilter 过滤器可以将 POST 请求转化为 PUT 请求和 DELETE 请求 -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
REST 风格请求
<input type="button" value="增" id="add"/>
<input type="button" value="删" id="del"/>
<input type="button" value="改" id="update"/>
<input type="button" value="查" id="select"/>
<script type="text/javascript" src="../js/jquery-1.8.0.js"></script>
<script>
//增
$("#add").click(function(){
$.post("/eshop/user",{name:"libai",age:"20"},function(ret){
alert(ret);
});
});
//删
$("#del").click(function(){
/*
需增加一个 _method:"DELETE" 键值对。如果是form表单,可添加一个 hidden input。
SpringMVC 会解析为由服务器中 RequestMethod.DELETE 标注的方法处理。
*/
$.post("/eshop/user/1",{_method:"DELETE"},function(ret){
alert(ret);
});
});
//改
$("#update").click(function(){
/*
需增加一个 _method:"PUT" 键值对。如果是form表单,可添加一个 hidden input。
SpringMVC 会解析为由服务器中 RequestMethod.PUT 标注的方法处理。
*/
$.post("/eshop/user",{_method:"PUT",name:"libai",age:"20"},function(ret){
alert(ret);
});
});
//查
$("#select").click(function(){
$.get("/eshop/user/libai/20",function(ret){
alert(ret);
});
});
</script>
REST 风格请求处理
@RestController
public class RestfulController {
/** 增 */
@PostMapping("/user")
//@RequestMapping(value = "/user",method = RequestMethod.POST)
public String add(String name,Integer age){
return "add:"+name+age;
}
/** 删 */
@DeleteMapping("/user/{id}")
//@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
public String del(@PathVariable String id){
return "del:"+id;
}
/** 改 */
@PutMapping("/user")
//@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String update(String name,Integer age){
return "update:"+name+age;
}
/** 查 */
@GetMapping("/user/{name}/{age}")
//@RequestMapping(value = "/user/{name}/{age}",method = RequestMethod.GET)
public String select(@PathVariable String name,@PathVariable Integer age){
return "select:"+name+age;
}
}
3:怎么在Springboot里使用REST风格
配置过滤器,启用过滤器
在application.properties里面改为true即可(因为内置了过滤器)
# RESTful
spring.mvc.hiddenmethod.filter.enabled=true
内容补充与代码展示
url表示资源,http请求方式表示操作,GET查 POST增 PUT改 DELETE删
GET 请求 用途: 用于从服务器检索资源。GET 请求通常用于查询数据。 POST 请求 用途: 用于向服务器提交数据以创建新的资源。POST 请求通常用于新增数据。
如果用的是ajax技术的话,那就是会在接收是用上注解@ResponseBody
Rest风格可以做到
注解合一:@RestController=@Controller+@ResponseBody
/**
* RESTful: url 表示资源,http请求方式表示操作(GET-查、POST-增、PUT-改、DELETE-删)
*/
@Log4j
@RestController
public class UserController{
@Autowired
private UserService userService;
@GetMapping("/user")
public User doLogin( User user){
return userService.select(user);
}
@PostMapping("/user")
public boolean doAdd(User user){
return userService.add(user);
}
@GetMapping("/user/list")
public PageInfo<User> doList(User user, PageQueryBean page) {
// 分页设置
PageHelper.startPage(page.getPageNum(),page.getPageSize());
// 查询
ArrayList<User> list = userService.list(user);
return new PageInfo<User>(list);
}
@DeleteMapping("/user/{id}")
public boolean deleteById(@PathVariable("id") String id){
return userService.deleteById(id);
}
@PutMapping("/user")
public boolean update(User user) {
return userService.update(user);
}
@GetMapping("/user/{username}")
public boolean selectYhm(@PathVariable("username") String yhm){
return userService.selectYhm(yhm);
}
}
methods:{
// 重置
doReset(){
this.user = {
yhm:'',
yhsf:'',
zcsj:'',
sjh:'',
sex:'',
email:''
};
},
doPageReset(){
this.page = {
pageNum: 1,
pageSize: 5,
pages:0,
total:0
}
},
doPageList(pageNum){
if(pageNum == 0){
pageNum = 1;
}
if(pageNum > this.page.pages){
pageNum = this.page.pages;
}
this.page.pageNum = pageNum;
this.doList();
},
doFormList(){
this.doPageReset();
this.doList();
},
// 查询
doList(){
axios({
url:'/book/user/list',
method:'GET',
params: Object.assign({},this.user, this.page)
}).then(response => {
console.log(response.data)
this.users = response.data.list;
// 分页信息
this.page.pages = response.data.pages;
this.page.total = response.data.total;
});
},
// 删除
doDelete(user){
axios({
url:"/book/user/"+user.yhbh,
method:'DELETE',
}).then(response => {
if(response.data === true){
this.doList(); // 删除成功,查询刷新表格数据
}
});
},
// 显示 更新弹窗
showUpdateWindow(user){
$("#updateWindow").show("slow");
this.updateUser = Object.assign({},user);
},
// 关闭 更新弹窗
closeUpdateWindow(){
$("#updateWindow").hide("slow");
},
// 保存更新
doAdd(){
axios({
url:"/book/user",
method:'PUT',
params:this.updateUser
}).then(response => {
if(response.data === true){
this.doList(); // 更新成功,查询刷新表格数据
}
this.closeUpdateWindow(); // 关闭弹窗
});
}
},
mounted(){
// 页面初始化查询
this.doList();
}
这两段代码分别是后端controller层和前端的方法,
总结
RESTful 风格(Representational State Transfer)是一种设计网络应用程序的架构风格,旨在利用 HTTP 协议的现有标准,以简洁的方式创建可扩展的 Web 服务。RESTful 风格使 API 的设计更具一致性和可维护性。
RESTful 风格的核心原则
-
无状态性(Stateless):
- 每个请求从客户端到服务器必须包含所有必要的信息,以便服务器理解和处理请求。服务器不应在请求之间存储任何状态信息。
-
统一接口(Uniform Interface):
- 通过使用一致的接口(通常是 HTTP 方法和 URL 结构),简化和分离系统的架构。
-
资源的表现(Resource Representation):
- 在 REST 中,资源是 API 的核心。每个资源都可以通过 URI(统一资源标识符)进行标识,客户端通过不同的表现形式(如 JSON 或 XML)与资源进行交互。
-
客户端-服务器结构(Client-Server Architecture):
- 客户端和服务器的职责分离,客户端负责用户界面和用户体验,服务器负责数据存储和业务逻辑。这样可以提高系统的可伸缩性。
-
层次化系统(Layered System):
- 系统可以由多个层次构成,每层只与相邻层进行交互。这有助于实现负载均衡、缓存和安全性等功能。
-
可缓存性(Cacheability):
- 资源应具有明确的缓存指示,允许客户端缓存响应以提高性能和减少服务器负担。
RESTful API 的基本构造
-
资源标识符(URI):
- 资源通过唯一的 URI 进行标识。例如:
- 获取用户列表:
GET /users
- 获取特定用户:
GET /users/{id}
- 创建新用户:
POST /users
- 更新特定用户:
PUT /users/{id}
- 删除特定用户:
DELETE /users/{id}
- 获取用户列表:
- 资源通过唯一的 URI 进行标识。例如:
-
HTTP 方法:
- GET: 检索资源。
- POST: 创建资源。
- PUT: 更新资源。
- DELETE: 删除资源。
-
状态码:
- 200 OK: 请求成功。
- 201 Created: 资源创建成功。
- 204 No Content: 删除操作成功。
- 400 Bad Request: 请求无效。
- 404 Not Found: 资源未找到。
- 500 Internal Server Error: 服务器内部错误。