详解 @RequestMapping 中的 consumes 和 produces

JAVA herman 1343浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

@RequestMapping 注解非常的强大,Spring MVC 和 SpringBoot 中都会用到这个注解。要学会 @RequestMapping 的用法,就需要从它的原理和实现机制说起。本文我们就一起来扒一扒 @RequestMapping 的神秘面纱。

@RequestMapping 是用来映射请求,可以配置在类上,也可以配置在方法上。说到映射请求,我们就应该想到 Servlet 在 web.xml 中的配置。

<servlet>
    <servlet-name>xttblog</servlet-name>
    <servlet-class>com.xttblog.XttblogController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>xttblog</servlet-name>
    <url-pattern>/xttblog</url-pattern>
</servlet-mapping>

@RequestMapping 注解的作用就和上面的 web.xml 中配置 Servlet 映射的作用类似。

了解了 @RequestMapping 的作用,我们再来看看 @RequestMapping 注解的源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";
    String[] value() default {};
    String[] path() default {};
    RequestMethod[] method() default {};
    String[] params() default {};
    String[] headers() default {};
    String[] consumes() default {};
    String[] produces() default {};
}

对上面的注解,简单解释一下。

在 @Target 中有两个属性,分别为 ElementType.METHOD 和 ElementType.TYPE。这表明了 @RequestMapping 注解可以作用在类和方法上。

@RequestMapping 注解中的属性除了 name 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值。

将 @RequestMapping 注解在方法上,而 Controller 上未添加 @RequestMapping 注解时,这时的请求 URL 是相对于 Web 根目录 /。

@RequestMapping 中的 method 主要用来定义接收浏览器发来的何种请求。使用枚举类 org.springframework.web.bind.annotation.RequestMethod 来定义浏览器请求的方式。我们常用的有 4 种方式,分别是:GET(查)、POST(增)、PUT(改)、DELETE(删)。

method 返回的也是一个数组,因此也可以指定多个。如下所示:

@Controller
@RequestMapping(path = "/xttblog")
public class XttblogController {
    // 该方法将同时接收通过GET和POST方式发来的请求
    @RequestMapping(path = "/login", method={RequestMethod.POST,RequestMethod.GET})
    public String login() {
        return "success";
    }
}

@RequestMapping 的 params 属性,该属性表示请求参数,也就是追加在URL上的键值对。看下面的例子:

@Controller
@RequestMapping(path = "/xttblog")
public class XttblogController {
    // 该方法将接收 /xttblog/login 发来的请求,且请求参数必须为 username=xttblog&password=123456
    @RequestMapping(path = "/login", params={"username=xttblog","password=123456"})
    public String login() {
        return "success";
    }
}

@RequestMapping 的 headers 属性,表示请求头中的配置。例如常见的 token,一般都是放在请求头中。headers 属性同样支持多个配置的。

例如,headers="Host=localhost:8080" 则表示只接收本机发来的请求。

@RequestMapping 中的 value 属性还支持占位符。如下用法:

@RequestMapping(value="/{id}", method=RequestMethod.GET)
public String show(@PathVariable("id") Integer id) {
    return "success";
}

show() 方法将可以接收 user/1、user/2、user/3等路径的请求,但是请求的方法必须为 GET,使用 @PathVariable 为应用实现 REST 规范提供了具大的便利条件。

@RequestMapping 的 value 属性还支持非常复杂的正则表达式,但是同样的需要配合 @PathVariable 注解一起使用。

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
public void handle(@PathVariable String version, @PathVariable String extension) {}

consumes 属性用来限制 ContentType。ContentType 用来告诉服务器当前发送的数据是什么格式。
produces 用来限制 Accept。Accept 用来告诉服务器,客户端能认识哪些格式,最好返回这些格式中的其中一种。

如果我们配置了,consumes={"application/xml","application/json"},produces={"application/xml"} 那么我们就只能接收 application/xml 格式,也只返回 xml 格式。

至此,@RequestMapping 的大多用法都已经解释完了。熟能生巧,大家都用起来吧!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 详解 @RequestMapping 中的 consumes 和 produces