why RPC-RESTful use POST
最近在写dubbo-go的OpenAPI支持,发现几乎所有的RPC框架中RESTful规范都只使用POST方法,于是上google冲浪了一会了解了一下前因后果,加深了对RESTful的理解。
说来也惭愧,我给人家写这个东西,但我自己却没怎么用过,有点本末倒置。
发现了一个很有趣的现象,有人说: “一把梭:REST API 全用 POST”,似乎有一部分人认为只有POST method就够用了。 因为我一直没有接触过增删改查的业务代码,所以我不太了解其中背后的原因。
我不理解为什么要问这个东西,不应该问POST和PUT之间的区别吗?
见了鬼了,bro
REST的增删改查大家都知道(POST, DELETE, PUT, GET),之前看过别人面试,面试官问了POST和GET的区别,感觉那人也是背概念。我的理解就是POST是非幂等性的,跟其他的method不一样,但这在RPC框架中又不对起来了。因为全是POST method,如果这时有一个服务 GetUser(id),我们调用它应该是调用多少次都是一样的。所以从这时我开始意识到RPC框架中只是支持REST这种格式,而并不遵守REST的理念,那这就好说了。
To be honest, I can't believe it.
这看着更像是懒得跟用户解释,随便编得借口,我没有看到GET删查的使用,只看到了POST一把梭。"DELETE和PUT甚至会被一些防火墙阻挡",这是Dubbo应该考虑的事情吗?
Dubbo的官网是怎么介绍的呢?上面是这样写的:“REST服务中虽然建议使用HTTP协议中四种标准方法POST、DELETE、PUT、GET来分别实现常见的“增删改查”,但实际中,我们一般情况直接用POST来实现“增改”,GET来实现“删查”即可(DELETE和PUT甚至会被一些防火墙阻挡)。”
站在我的角度分析一下为什么RPC中只有POST,在我看来RPC的风格并不能用增删改查(POST, DELETE, PUT, GET)来解释,RPC是想让远程服务调用像调用本地函数一样简单。所以在语义上选择哪个都不合适,正因为如此,我们只需找到在格式上最合适的method调用就好了。于是POST因其万能的格式脱颖而出。这是我目前理解RPC-RESTful为什么只用POST的原因。
Apr 2025