REST 风格与在Springboot里使用

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 风格的核心原则

  1. 无状态性(Stateless):

    • 每个请求从客户端到服务器必须包含所有必要的信息,以便服务器理解和处理请求。服务器不应在请求之间存储任何状态信息。
  2. 统一接口(Uniform Interface):

    • 通过使用一致的接口(通常是 HTTP 方法和 URL 结构),简化和分离系统的架构。
  3. 资源的表现(Resource Representation):

    • 在 REST 中,资源是 API 的核心。每个资源都可以通过 URI(统一资源标识符)进行标识,客户端通过不同的表现形式(如 JSON 或 XML)与资源进行交互。
  4. 客户端-服务器结构(Client-Server Architecture):

    • 客户端和服务器的职责分离,客户端负责用户界面和用户体验,服务器负责数据存储和业务逻辑。这样可以提高系统的可伸缩性。
  5. 层次化系统(Layered System):

    • 系统可以由多个层次构成,每层只与相邻层进行交互。这有助于实现负载均衡、缓存和安全性等功能。
  6. 可缓存性(Cacheability):

    • 资源应具有明确的缓存指示,允许客户端缓存响应以提高性能和减少服务器负担。

RESTful API 的基本构造

  1. 资源标识符(URI):

    • 资源通过唯一的 URI 进行标识。例如:
      • 获取用户列表:GET /users
      • 获取特定用户:GET /users/{id}
      • 创建新用户:POST /users
      • 更新特定用户:PUT /users/{id}
      • 删除特定用户:DELETE /users/{id}
  2. HTTP 方法:

    • GET: 检索资源。
    • POST: 创建资源。
    • PUT: 更新资源。
    • DELETE: 删除资源。
  3. 状态码:

    • 200 OK: 请求成功。
    • 201 Created: 资源创建成功。
    • 204 No Content: 删除操作成功。
    • 400 Bad Request: 请求无效。
    • 404 Not Found: 资源未找到。
    • 500 Internal Server Error: 服务器内部错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值