spring框架中RESTFUL接口相关注解
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 中使用 @RequestMapping 的 consumes 属性
@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接口相关注解的更多相关文章
- spring框架中三层架构相关的注解
做了这么多年的C++,再去学Java,确实发现,语言都是相通的,即使是Java的那么多生态,理解起来也并不费劲 Spring 框架目前还在学习中,处于 Tourist 阶段,目前只求会做,不求原理,等 ...
- Spring框架中的AOP技术----注解方式
利用AOP技术注解的方式对功能进行增强 CustomerDao接口 package com.alphajuns.demo1; public interface CustomerDao { public ...
- 聊一聊 Spring Boot 中 RESTful 接口设计规范
在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则.接口单一原则.接口过滤和接口组合等诸多因素,本篇文章将简要分 ...
- 无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范
在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则.接口单一原则.接口过滤和接口组合等诸多因素,本篇文章将简要分 ...
- spring框架中的@Import注解
spring框架中的@Import注解 Spring框架中的@Import注解 在之前的文章中,作者介绍了Spring JavaConfig. 这是除了使用传统的XML文件之外,spring带来的新的 ...
- Spring5源码解析-Spring框架中的单例和原型bean
Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...
- spring学习12 -Spring 框架模块以及面试常见问题注解等
以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...
- Spring框架中ModelAndView、Model、ModelMap区别
原文地址:http://www.cnblogs.com/google4y/p/3421017.html SPRING框架中ModelAndView.Model.ModelMap区别 注意:如果方法 ...
- Spring框架中的定时器 使用和配置
Spring框架中的定时器 如何使用和配置 转载自:<Spring框架中的定时器 如何使用和配置>https://www.cnblogs.com/longqingyang/p/554543 ...
- 细说shiro之五:在spring框架中集成shiro
官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...
随机推荐
- 【每日一题】20.K-th Number (二分 + 尺取)
关于此题,我们分析一下: 一个区间第k大的数不小于x的条件是什么? 答案就是一个区间内不小于x的数的个数不小于k 那么,我们就会发现,我们其实并不需要知道每个数的值,实际上对我们有用的只有每个数与x的 ...
- 数论(7):康托展开&逆康托展开
康托展开可以用来求一个 \(1\sim n\) 的任意排列的排名. 什么是排列的排名? 把 \(1\sim n\) 的所有排列按字典序排序,这个排列的位次就是它的排名. 时间复杂度? 康托展开可以在 ...
- 【调试】crash使用方法
crash简介 crash是redhat的工程师开发的,主要用来离线分析linux内核转存文件,它整合了gdb工具,功能非常强大.可以查看堆栈,dmesg日志,内核数据结构,反汇编等等. crash支 ...
- HanLP — 汉字转拼音,简繁转换 -- JAVA
目录 语料库 训练 加载语料库 训练模型 保存模型 加载模型 计算 调用 HanLP 在汉字转拼音时,可以解决多音字问题,显示输出声调,声母.韵母,通过训练语料库, 本文代码为<自然语言处理入门 ...
- freeswitch两个DTMF转换接口的区别
概述 freeswitch支持三种模式的DTMF传输方式,分别时inband.INFO.2833. 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中, ...
- C#使用正则表达式检查字符串中重复出现的词
private void button1_Click(object sender, EventArgs e) { MatchCollection matches =//使用正则表达式查找重复出现单词的 ...
- Kubernetes 内存资源限制实战
本文转载自米开朗基扬的博客 1. Kubernetes 内存资源限制实战 Kubernetes 对内存资源的限制实际上是通过 cgroup 来控制的,cgroup 是容器的一组用来控制内核如何运行进程 ...
- CSS3之transition
随着css3不断地发展,越来越多的页面特效可以被实现. 例如当我们鼠标悬浮在某个tab上的时候,给它以1s的渐进变化增加一个背景颜色.渐进的变化可以让css样式变化得不那么突兀,也显得交互更加柔和. ...
- 【Hash】字符串哈希
Hash 的核心思想在于,将输入映射到一个值域较小.可以方便比较的范围,典型的用法就是将资源紧张的设备中的不定长字符串转化为定长整数,以达到节省空间的目的 如:printf("This is ...
- Shell-获取终端输入-read