SpringBoot的rest风格设计源码解析

1.何为Rest风格

之前我们设计映射层的时候习惯把不同的操作对应不同的方法映射不同的网页

例如我们对User进行增删改查的时候

保存用户的映射/saveUser                  删除用户的映射/deleteUser

改变用户的映射/updateUser                  查找用户的映射/selectUser

这样的坏处就是对应的网页过多,而且繁杂不堪

Rest风格就是对同一对象的增删改查对应同一个对象

同样对User进行操作,不论增删改查都对应/User

那么对应的映射一样,增删改查必定对应不同的controller,那么我们如何区别呢?

答案是通过请求方法动词

保存用户的请求方法动词POST          删除用户的请求方法动词DELETE

改变用户的请求方法动词PUT          查找用户的请求方法动词GET

2.下面我们开始测试

以下是我的index代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
welcome
<a href="rest">rest</a><br>
<form action="/user" method="get">
    <input type="submit" value="Get">
</form><br>
<form action="/user" method="post">
    <input type="submit" value="Post">
</form><br>
<form action="/user" method="post">
    <input type="submit" value="Delete">
</form><br>
<form action="/user" method="post">
    <input type="submit" value="Put">
</form><br>
</body>
</html>

这是controller代码

package com.sptingbootlearn3.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class firstcontroller {
//    处理资源请求时候是先找controller的mapping,然后找静态资源,都找不到报错
    @RequestMapping("bug.jpg")
    public String string(){
        return "aaaaa";
    }
    @RequestMapping("/rest")
    public String rest(){
        return "rest";
    }
    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public String GETrest(){
        return "GET";
    }
    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String POSTrest(){
        return "POST";
    }
    @RequestMapping(value = "/user",method = RequestMethod.PUT)
    public String PUTrest(){
        return "PUT";
    }
    @RequestMapping(value = "/user",method = RequestMethod.DELETE)
    public String DELETErest(){
        return "DELETE";
    }
}

我们开始运行

然后自上而下依次点击

 

 

发现问题没有,PUT跟DELETE全部当成了POST,这是由于html的问题,我们使用form的时候有且只有两种方法get跟post,所以必须进行配置上的修改

学过MVC的应该知道可以通过配置HiddenHttpMethodFilter来解决,但是我们现在是在使用springboot,里面给我们进行了很多自动配置,我们需要用到用到什么的时候自动装配

那么我们先对代码进行一下修改

<form action="/user" method="get">
    <input type="submit" value="Get">
</form><br>
<form action="/user" method="post">
    <input type="submit" value="Post">
</form><br>
<form action="/user" method="post">
    <input name="_method" type="hidden" value="delete"/>
    <input type="submit" value="Delete">
</form><br>
<form action="/user" method="post">
    <input name="_method" type="hidden" value="put"/>
    <input type="submit" value="Put">
</form><br>

我们来执行查看一下delete跟put的结果

发现依然不对,那么我们就需要查看一下源码了

我们搜索点进WebMvcAutoConfiguration即webmvc的自动配置类

里面找到配置HiddenHttpMethodFilter的部分代码

@Bean
    @ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
    @ConditionalOnProperty(
        prefix = "spring.mvc.hiddenmethod.filter",
        name = {"enabled"}
    )
    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new OrderedHiddenHttpMethodFilter();
    }

这里面有三个注解

@Bean
@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
@ConditionalOnProperty(
    prefix = "spring.mvc.hiddenmethod.filter",
    name = {"enabled"}
)

其中第一个是一个简单的bean无关紧要

第二个是条件注解,条件就是我们没有自己配置专属HiddenHttpMethodFilter,显然我们没有配置

条件成立

第三个也是条件注解,该注解要求我们的spring.mvc.hiddenmethod.filter属性数值是enabled的时候成立

这个属性我们之前没有配置,条件注解一个不成立就会导致整段方法不执行,那么我们在application.yaml中配置该属性

再次执行

 

 成功执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值