有无懂哥解释下 @PostMapping 与 @PutMapping 注解本质上到底有什么区别

201 天前
 rhlyym
  1. 有没有大佬告知下这两个在 spring boot 里面到底有什么本质的区别
  2. 对于 @PutMapping 他既可以通过 url 传参又可以通过请求体传参,这样的形式符合规范吗,为什么不像 @PostMapping 一样参数都在请求体里面,搞出 @PutMapping 不是多此一举吗
1932 次点击
所在节点    Java
19 条回复
zilongzixue
201 天前
@PostMapping 也可以在 url 传参,本质上就是 restful 命名,增删改查,你喜欢你用 deletemapping 都可以
Ayanokouji
201 天前
点进去看看源码,都是 RequestMapping ,如果你还是不懂的话,建议学习 http ,什么位置传参跟 spring boot 关系不大
@RequestMapping(
method = {RequestMethod.PUT}
)
Oktfolio
201 天前
REST 的语义化

POST 一样可以在 url 传参

PUT 语意就是完全替换资源或在资源不存在的情况下创建一个新的资源,PUT 方法的实现应该是幂等的,也就是多次执行结果都相同
POST 方法则不一定是幂等的

PUT 、DELETE 、PATCH 等语义化的方法都是在 POST 方法基础上加上参数识别的
zzl22100048
201 天前
根据 http 协议,http 所有方法没有区别,就是个标志;所有区别都是人为规定的
ZZ74
201 天前
PUT 是 HTTP 协议的一种方法
因为狗屎 RESTFUL ,非要 给 HTTP 请求搞 “赋能”
Spring 一看 行吧 就给你加个注解 反正对我没啥成本
sumarker
201 天前
接口只能接特定类型的请求,本意是为了让 restful 请求“规范”,
但一般都会嫌麻烦或者其他各种原因,@postmapping 一把梭
Oktfolio
201 天前
@Oktfolio #3
更正一下,都是 HTTP 协议的方法,本身是没有上面说的含义的,是 RESTful 对其赋予了含义。

在 HTTP/1.1 不需要使用 POST _method 来模拟,在 HTTP/1.0 中需要

SpringMVC 中对应获取 _method 的代码在 HiddenHttpMethodFilter 中
snickers
201 天前
PUT 请求具有幂等性,执行多次 PUT 请求的结果应该相同,POST 请求不具有幂等性
Masoud2023
201 天前
你没理解 restful 语义。

@XXXMapping 都只是处理对应 method 的请求,点进去你会发现基本都是 `@RequestMapping(method ={RequestMethod.XXX} )`

GET/POST/PUT/DELETE 之类的 method 语义,充其量也只是语义而已。

不是说 GET 就不能放个 body 进去,也不是说 POST 就不能 url 传参,也就是 query param 。

只要你想,怎么用那也都算 http 请求,只是一般没有人这么用,并且一些轮子,get 请求根本发不出去 body ,我没记错的话 restTemplate 处理这种就会有问题。

你如果想看一些讨论的话可以去 stackoverflow ,https://stackoverflow.com/questions/978061/http-get-with-request-body

归根结底只是一种君子协议,你可以选择不做君子,但是到时候你也不要怪君子不讲人情。

我也比较认同“restful 是一坨屎”这个观点,实际上真让一些人写 restful ,恐怕也没几个人能写好这种东西。

回到你的问题上,PutMapping 和 PostMapping 也都是可以传 query param 的,并且这种设计其实日常用的蛮多的,比如修改帖子内容,完全可以把帖子 id 放到 query param ,然后让 body 只保留 entity ,这是一种非常 fantastic 的设计,PutMapping 不是多此一举,他只是更加符合语义的一种写法。

能看出来你可能是新手,我建议别理解了,直接无脑 GET/POST 就行了,取数据就 GET ,存、改、删就 POST ,没什么不行的。
nothingistrue
201 天前
@PostMapping 只能接受 http method = POST 的请求, @PutMapping 只能接受 http method = PUT 的请求。单独 @PostMapping 的请求,如果你拿 PUP 去请求,回收到 405 Method Not Allowed 。反之亦然。

@PostMapping 跟 @PutMapping 就上面那点区别。这是强制性的编码逻辑,不是非强制性的规范。虽然楼上几个确实在回复楼主真正该问的,但是对于原始问题的回答,是错的。

楼主真正该问的,是 http method 中,POST 和 PUT 的区别。这俩在「 URL]和[参数载体」上,是一模一样的,没有区别。POST 、PUT 的参数,都是可以即用 URL ,也可以用请求体的,具体怎么用看个人喜好。它们的区别,主要在接口本身的用途上,简单的说:POST 是推送新数据,PUT 是修改现有数据。
nothingistrue
201 天前
虽然 PUT 、POST 的传参方式,看个人喜好,但是额外遵守一个规范,对个人和团队都有好处。

一般来说:ID 这种明显的目录性质的参数,应通过 URL 本体携带(? 前面的部分),动态查询条件应通过 queryParam (?后面的部分)携带,而数据则应通过请求体携带。POST 是推送新数据,新数据是没有 ID 的,故所有内容都通过参数体携带。PUT 是修改数据,这需要首先指定 ID 然后指定要修改的数据,所以他需要同时有 URL 参数和请求提参数。

当然,如果 PUT 请求的 ?后面还带了业务参数,那不影响功能,但是个大坑。
nerkeler
201 天前
你以为 @GetMapping 就不能传请求体了吗
netabare
201 天前
本质的区别就是一个是 POST ,一个是 PUT ,这是 RESTful 定义的,和 Spring 注解没啥关系。

再不然看源码也好。「既可以……又可以……」更多是编程语言具体实现的问题,可以这么做不代表它是合理的。
ThreeK
201 天前
俩个维度东西啊。
请求方式 :put post 区别。
传参方式: 能 uri 、body 体
mango88
201 天前
用法跟他的规范关系不大,可以选择遵守 也可以 post 一把梭
Chinsung
201 天前
本质?本质就是一个接受的是 http post 请求,一个接受的是 http put 请求
learningman
201 天前
你乐意的话定义个 abc method 也是可以的
me1onsoda
200 天前
@snickers 幂不幂等只和你写的代码有关系,和协议无关吧
goalidea
199 天前
这就跟很早以前男女都都上一个茅坑,现在规范( restful )了分了男厕所,女厕所,母婴厕所一个道理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/983827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX