1、说明

springboot 是国内最常用的web框架,因为它的http server功能是最重要的。本文列举了一些现在通用的restful形式的接口所需要的注解

2、@RequestMapping

@RequestMapping 注解用于请求地址的解析,是最常用的一种注解

源码如下:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default ""; @AliasFor("path")
String[] value() default {}; @AliasFor("value")
String[] path() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {};
}
  • @Target 表示,此注解可以用在类和方法上;
  • @Retention(RetentionPolicy.RUNTIME) 表示,测注解保留到程序运行时,即程序运行时此注解有效;

该注解的参数如下:

2.1、name

为映射设置名称

2.2、path和value

  • path ,顾名思义,运行时,它能够得到地址;

  • 该属性是一个字符串数组,表示,可以同时映射多个地址;

而之所以把path和value写在一起,是因为这两个属性的作用的相同的。可以看到,这两个属性都使用spring的注解 @AliasFor 互相修饰,表示这两个属性互为别名

这里之所以使用 value 属性,是因为,java注解中,如果有多个属性,而使用时,又不指定参数名,则默认传递给 value 熟悉。所以,这里使用别名的作用是,使用时可以不使用属性名,直接使用值来表示地址

spring框架中的注解都会有value属性

@RequestMapping("/index")
public String index(){
return "hello";
}

如上例,表示,“/index” 以为没有指定属性名,属于传递给了value属性,也就是path属性

2.2.1、@pathVariable

使用path映射url的path,但是对于同一个类型的url,只是path不同,但是处理方式不一样,如果各自写一个方法的话,就显得很多余了,所以可以使用path变量

  • 变量使用中括号修饰,配合注解 @PathVariable 一起使用,可以得到传入的path;

  • 这里还可以使用正则表达式对变量允许的值进行过滤;

示例:

@RequestMapping(value="/index/{name}")
public String index(){
return "bbb";
}

上例中,可以映射path为 /index/xxxx 等的url

@RequestMapping(value="/index/{name:[a-z]}")
public String index(){
return "bbb";
}

上例中,使用了正则表达式,[a-z] 表示a-z的一个字符,所以,只能映射/index/a等,二级目录只是一个字母的url

2.3、method

故名思议,表示,http请求使用的方法,它的类型是 RequestMethod 数组,RequestMethod 是一个枚举,源码如下:

public enum RequestMethod {
GET,
HEAD,
POST,
PUT,
PATCH,
DELETE,
OPTIONS,
TRACE; private RequestMethod() {
}
}

可以看到,它是包含一系列HTTP方法的枚举类型

而类型是数组表示,它可以指定该接口/类可以监听多种方法

2.4、params和header

params 参数用于过滤请求,根据该参数值,只将符合条件的请求传递到该方法/类中

如果有多个参数,则参数之间是 的关系

示例:

@RequestMapping(value="/index", params = "age=12")
public String index(){
return "bbb";
} @RequestMapping(value="/index", params = {"age=13,name=ab"})
public String index2(){
return "ccc";
}

上例中,index() 映射请求中,参数age为12的请求

index2() 方法映射请求中,参数age为13且name为ab的请求

headers 参数的效果和 params 类似,区别是header 过滤的是HTTP协议中的header参数

示例:

@RequestMapping(value="/index", headers="content-type=text/html")
public String index2(){
return "aaa";
}

2.5、consumes和produces

consumes 用于过滤请求内容类型(Content-Type 值)

produces 用于指定返回值类型

Content-Type 在HTTP协议的消息头中用于表示资源的媒体类型,consumes 的作用就是根据参数过滤

@RequestMapping(value = "/index", consumes = "application/json")
public String index3(){
return "aaa";
}

3、@PathVariable

@PathVariable 用于接口的参数获取

在上文的2.2.1中,path变量配合此注解,可以得到传入的path

@PathVariable 只有name和value两个参数,互为别名,使用时需要传入一个name

示例:

@RequestMapping(value="/index/{name}")
public String index(@PathVariable("name") String myName){
return "bbb";
}

@PathVariable 的参数 name 的要和 @RequestMapping 的 path 参数中的path变量一致

上例中,myName 参数的值为url的二级path

4、@RequestParam

@RequestParam 用于 通过接受表单形式的参数,即传入的参数必须可以是拼接在URL后面的key-value,也可以是body里面的表单形式的key-value

源码如下:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default ""; @AliasFor("value")
String name() default ""; boolean required() default true; String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

可见,@RequestParam 特性如下:

  • 需要传三个参数:name/value、required和defaultValue,name表示参数名,reuqired表示此参数是否必须传入,defaultValue表示默认值;
  • 若不指定默认值,则未传的参数会设为nul;

示例1:url 传参

@RequestMapping(value="/index")
public String index(@RequestParam("name") Integer name){
return "bbb";
}

需要注意的是,如果参数类型设置为基本的数据类型,而请求又没有传参的话,会报错,因为基本数据类型没有null类型,所以使用Java包装类即可

示例2:body中form形式的传参

需要注意的是,HTTP协议body中传参的形式有多种,这里需要分别处理

默认接受以文本的形式传递的参数,也有的软件叫 raw

若传参的形式不同,接口需要设置 HTTP 协议头的 Content-Type 的值来接受参数,即,spring 中使用 @RequestMappingconsumes 属性

@RequestMapping(value="/index2",
consumes="application/x-www-form-urlencoded")
public String index2(
@RequestParam("name") String myName,
@RequestParam("age") Integer age){
return "bbb";
}

这里使用了 key-value 键值对的表单形式,@RequestParam 可以忽略,简化成如下代码,效果相同

@RequestMapping(value="/index2",
consumes="application/x-www-form-urlencoded")
public String index2(String name, Integer age){
return "bbb";
}

但是,如果参数过多,则函数的参数列表就会很长,所以这里可以封装成一个类

public class People {
private Integer id;
private String name;
private Integer age;
//忽略getter和setter
}
 @RequestMapping(value="/index2",
consumes="application/x-www-form-urlencoded")
public String index2(People people){
return "bbb";
}

并且,此时无需使用注解,spring 会自动拼装类

5、@RequestBody

@RequestBody 接受的body内的单一参数,即非表单形式的参数,因为,其也就不能接收GET方法的传参了

其源码如下:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
boolean required() default true;
}

@RequestBody 有一个属性 required,默认true,表示单一参数是否必须传入

示例1:

raw 的方式

@RequestMapping(value="/index")
public String index(@RequestBody String requestParam){
return "bbb";
}

上例中,可以接受到以raw方式传递的参数

示例2:

x-www-form-urlencoded 的方式

x-www-form-urlencoded 是一种把表单数据编码成单一数据的格式,所以可以使用 @RequestBody 来获取

@RequestMapping(value="/index2", consumes="application/x-www-form-urlencoded")
public String index2(@RequestBody String requestParam){
return "bbb";
}

示例3:

@RequestBody 能够将单一形式的参数转换成Java类,这需要参数的key和java类的属性一对一相同,不同的属性则设置为null

@RequestMapping(value="/index")
public String index(@RequestBody Product product){
return "aaa";
}

如上,执行后,controller 内的参数能够自动解析raw方式的传参

6、@ResponseBody

@ResponseBody 注解的作用是将 java 对象转换位 json 格式的数据

声明如下:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}

由此可知

  • 该注解可以用在类和方法上;
  • 程序运行时有效;
  • 无参数属性;

@ResponseBody 注解可以将 controller 方法返回的 java 对象通过适当的转换器转换成指定的格式,并返回到 http response 的 body 区内,通常返回 json 和 xml

使用该注解后,不会走视图处理器,而是直接将数据写入到流中,效果等同于使用 response 对象输出指定格式的数据

spring框架中RESTFUL接口相关注解的更多相关文章

  1. spring框架中三层架构相关的注解

    做了这么多年的C++,再去学Java,确实发现,语言都是相通的,即使是Java的那么多生态,理解起来也并不费劲 Spring 框架目前还在学习中,处于 Tourist 阶段,目前只求会做,不求原理,等 ...

  2. Spring框架中的AOP技术----注解方式

    利用AOP技术注解的方式对功能进行增强 CustomerDao接口 package com.alphajuns.demo1; public interface CustomerDao { public ...

  3. 聊一聊 Spring Boot 中 RESTful 接口设计规范

    在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则.接口单一原则.接口过滤和接口组合等诸多因素,本篇文章将简要分 ...

  4. 无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范

    在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则.接口单一原则.接口过滤和接口组合等诸多因素,本篇文章将简要分 ...

  5. spring框架中的@Import注解

    spring框架中的@Import注解 Spring框架中的@Import注解 在之前的文章中,作者介绍了Spring JavaConfig. 这是除了使用传统的XML文件之外,spring带来的新的 ...

  6. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

  7. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...

  8. Spring框架中ModelAndView、Model、ModelMap区别

    原文地址:http://www.cnblogs.com/google4y/p/3421017.html SPRING框架中ModelAndView.Model.ModelMap区别   注意:如果方法 ...

  9. Spring框架中的定时器 使用和配置

    Spring框架中的定时器 如何使用和配置 转载自:<Spring框架中的定时器 如何使用和配置>https://www.cnblogs.com/longqingyang/p/554543 ...

  10. 细说shiro之五:在spring框架中集成shiro

    官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...

随机推荐

  1. 安装vue脚手架@vue/cli 4.5.13(稳定版)

    若 NPM 下载过慢,请参考本处改换镜像源:Here 首先新建一个 vue 测试项目,还记得以前自己是用 vue-cli 2.0的版本 去构建的,毕竟里面有默认配置好的webpack配置,但现在很多小 ...

  2. Codeforce 1335C - Two Teams Composing 统计技能种类数量+统计同一技能最大数量

    7 4 2 4 1 4 3 4 统计技能种类数量 4种不同技能 统计同一技能最大数量 技能1(数量1) 技能2(数量1) 技能3(数量1) 技能4(数量4) 选出 技能4(数量4) 作为 第2组 扣除 ...

  3. Hystrix 如何解决 ThreadLocal 信息丢失

    本文分享 ThreadLocal 遇到 Hystrix 时上下文信息传递的方案. 一.背景 笔者在业务开发中涉及到使用 ThreadLocal 来存放上下文链路中一些关键信息,其中一些业务实现对外部接 ...

  4. secure boot (一)fit image

    前言 secure boot 和FIT Image是前段时间接触到的,其实早就该总结下了,奈何懒癌犯了,拖了好久才写出来. 之前也有人问我,工作后最大的感受是什么?我的回答是:"快速学习&q ...

  5. Python毕业设计推荐

    今天给大家推荐几个基于python/django的毕业设计/课程设计. 1. 网上商城系统 这是一个基于python+vue开发的商城网站,平台采用B/S结构,后端采用主流的Python语言进行开发, ...

  6. WPF|黑暗模式的钱包支付仪表盘界面设计

    阅读目录 效果展示 准备 简单说明 + 源码 结尾(视频及源码仓库) 1. 效果展示 欣赏效果: 2. 准备 创建一个WPF工程,比如站长使用 .NET 7 创建名为 WalletPayment 的W ...

  7. web - 解决 formdata 打印空对象

    获取单个值可以使用formData对象.get();而直接打印是看不到的.因为外界访问不到,你使用append方法后,对应的键值对就已经添加到表单里面了,你在控制台看到的是FormData原型,存储的 ...

  8. PC 网页 布局图

  9. Go-强制类型转换-T(x)

    类型转换 T(x) 具有相同的底层类型 数字类型之间可以互相转换(int系 uint系 float系),较大数转换成较小数会损失精度 字符串与切片之间的转换 string <==> []r ...

  10. [转帖]Shell三剑客之sed

    目录 Shell三剑客 sed工具 sed 流编辑器的工作过程 sed命令格式与选项操作符 sed命令的常用选项 sed命令的打印功能 默认打印方式 sed命令的寻址打印 文本模式过滤行内容 sed的 ...