[springMVC学习]3、rest请求方式,get、post、delete、put

导读:本篇文章讲解 [springMVC学习]3、rest请求方式,get、post、delete、put,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

基本介绍

快速入门

创建BookController

解决405错误

解决ajax不支持delete和put 

在web.xml配置过滤器

使用_method解决put和delete问题

源码分析

总结


基本介绍

        rest的全称是Representational State Transfer。翻译过来就是表现层状态转移,是现在比较流行的一种请求方式。

        在HTTP协议里面,拥有4个表示操作方式的动词。GET,POST,DELETE,PUT,这也就对应了传统的crud操作,get就是获取,post就是保存,delete就是删除,put就是更新。


快速入门

        在传统中,我们要更新一个资源,往往请求格式是 /xxx/xxx/update?id=1,通过这样的方式传递过去,而使用rest风格的请求方式,就是 /xxx/xxx/1的方式来进行,要进行的操作通过method来进行说明。

        下面通过一个案例来进行说明

创建BookController

@Controller
@RequestMapping("/book")
public class BookController {

    @GetMapping("/{id}")
    public ModelAndView get(@PathVariable("id") Integer id) {
        System.out.println("get方法---id=" + id);
        return success();
    }

    @PostMapping("/{id}")
    public ModelAndView post(@PathVariable("id") Integer id) {
        System.out.println("post方法---id=" + id);
        return success();
    }

    @DeleteMapping("/{id}")
    public ModelAndView delete(@PathVariable("id") Integer id) {
        System.out.println("delete方法---id=" + id);
        return success();
    }

    @PutMapping("/{id}")
    public ModelAndView put(@PathVariable("id") Integer id) {
        System.out.println("put方法---id=" + id);
        return success();
    }

    public ModelAndView success() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("/WEB-INF/pages/success.jsp");
        return modelAndView;
    }
}

        上面就是对应的4种请求方式,下面我们来以rest方式进行请求,使用postman来测试

 GET方式[springMVC学习]3、rest请求方式,get、post、delete、put

 POST方式

[springMVC学习]3、rest请求方式,get、post、delete、put

        可以发现get和post请求都没有问题,但是,如果我们用put或者delte请求就会出现问题 

put请求 

[springMVC学习]3、rest请求方式,get、post、delete、put

[springMVC学习]3、rest请求方式,get、post、delete、put

        后台也拿到了数据,但是请求转发页面时报了405的错误,405解释如下

[springMVC学习]3、rest请求方式,get、post、delete、put

         翻译过来就是目标资源不支持该请求方法

解决405错误

        这个错误的原因就是jsp只支持get,post,head方式请求。所以,解决方法就简单了,直接重定向即可。我们的思路就是写一个中间handler,这个方法转发到success页面,而put和delete请求重定向到该方法即可

    @DeleteMapping("/{id}")
    public String delete(@PathVariable("id") Integer id, HttpServletRequest request) {
        System.out.println("delete方法---id=" + id);
        return "redirect:/book/temp";
    }

    @PutMapping("/{id}")
    public String put(@PathVariable("id") Integer id, HttpServletRequest request, HttpServletResponse response) {
        System.out.println("put方法---id=" + id);
        return "redirect:/book/temp";
    }

    @RequestMapping("/temp")
    public ModelAndView temp() {
        return success();
    }

         再去使用delete的方式请求,没有问题

 [springMVC学习]3、rest请求方式,get、post、delete、put


解决ajax不支持delete和put 

        我们要解决该问题可以使用spring提供的HiddenHttpMethodFilter来对post请求进行转换,将其转换为put和delte

在web.xml配置过滤器

    <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>

        注意:配置了这个之后还要查看我们在spring配置文件中是否开启了注解驱动

    <!--开启注解驱动,支持JSR303校验,动态映射等-->
    <mvc:annotation-driven/>
    <!--springmvc不能处理的交由tomcat处理-->
    <mvc:default-servlet-handler/>

使用_method解决put和delete问题

        我们不再使用put和delete请求,而是使用post请求,携带一个_method参数,这个参数指定是put请求还是delete请求。

[springMVC学习]3、rest请求方式,get、post、delete、put

[springMVC学习]3、rest请求方式,get、post、delete、put


源码分析

        下面展示部分核心代码 

[springMVC学习]3、rest请求方式,get、post、delete、put

[springMVC学习]3、rest请求方式,get、post、delete、put

        可以发现,post方法就是在这个过滤器这里进行了转换,看springmvc是否支持我们在_method中配置的方法 

if (ALLOWED_METHODS.contains(method)) {
    requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);
}

         ALLOWED_METHODS这个是一个成员属性,是一个集合,我们debug可以看见该集合的内容

[springMVC学习]3、rest请求方式,get、post、delete、put

         说明支持的方法有3个,put,delete,patch。如果_method的值是这3个之一,那么就会进行转换,原理就是这样的。


总结

        在这篇文章中,讲解了rest请求风格,并且解决了405的问题,通过重定向来进行解决。我们在前端使用ajax的时候,由于不支持put和delete,我们需要使用_method隐藏域来解决,同时还需要配置一个HiddenHttpMethodFilter过滤器来进行处理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74821.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!