从Spring4.3开始引进了@GetMapping、@PostMapping、@PutMapping、@DeleteMappin
,来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。日常开发中,当决策具体的接口该使用哪个时不够清晰,于是深入挖掘一下他们之间的区别和联系。
先来了解一下@RequestMapping
,在Spring MVC 中使用 @RequestMapping
来映射请求,也就是通过它来指定控制器可以处理哪些URL请求。
@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 {};
}
@RequestMapping
中的 method
主要用来定义接收浏览器发来的何种请求。在Spring中,使用枚举类org.springframework.web.bind.annotation.RequestMethod
来定义浏览器请求的方式。
public enum RequestMethod {
GET,
HEAD,
POST,
PUT,
PATCH,
DELETE,
OPTIONS,
TRACE;
private RequestMethod() {
}
}
Http规范定义了多种请求资源的方式,最基本的有四种,分别为:GET(查)、POST(增)、PUT(改)、DELETE(删),而URL则用于定位网络上的资源相当于地址的作用,配合四种请求方式,可以实现对URL对应的资源的增删改查操作。在实际应用中,很多人并没有按照这个规范做,因为使用GET/POST同样可以完成PUT和DELETE操作,甚至GET也可以完成POST操作,因为GET不需要用到表单,而POST却需要通过表单来发送。具体的使用方式如下。
@RequiredPermission(AdminPermission.MERCHANT_EDIT)
@RequestMapping(value = "/create", name = "创建店铺",method = RequestMethod.POST)
public ModelAndView create(String merchant, String merchantAdmin) {
merchantService.create(parseModel(merchant, new Merchant()), parseModel(merchantAdmin, new MerchantAdmin()));
return feedback();
}
我们用@PostMapping
来代替@RequestMapping
@PostMapping(value = "/create", name = "创建店铺")
public ModelAndView create(String merchant, String merchantAdmin) {
merchantService.create(parseModel(merchant, new Merchant()), parseModel(merchantAdmin, new MerchantAdmin()));
return feedback();
}
此时他们达到的效果是一致的,省去了书写method = RequestMethod.POST
所以该如何决策使用哪个时就看这次请求期望做到的事情
- GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。
- POST(CREATE):在服务器新建一个资源,调用insert操作。
- PUT(UPDATE):在服务器更新资源,调用update操作。
- DELETE(DELETE):从服务器删除资源,调用delete语句
然后使用对应的组合注解
-
@GetMapping
是一个组合注解,是@RequestMapping(method = RequestMethod.GET)
的缩写。该注解将HTTP Get 映射到 特定的处理方法上。 -
@PostMapping
是一个组合注解,是@RequestMapping(method = RequestMethod.POST)
的缩写。该注解将HTTP Post 映射到 特定的处理方法上。 -
@PutMapping
是一个组合注解,是@RequestMapping(method = RequestMethod.PUT)
的缩写。该注解将HTTP Put 映射到 特定的处理方法上。 -
@DeleteMapping
是一个组合注解,是@RequestMapping(method = RequestMethod.DELETE)
的缩写。该注解将HTTP Delete 映射到 特定的处理方法上。
PS:日常开发中最常用的是@GetMapping
与@PostMapping
,控制层接口方法需要接收封装参数时,请求方式应为@PostMapping
,前端传参格式为不带任何包装的裸传,参数用&连接