About: IETF最近的一个关于HTTP新method的proposal
GET为什么不应该有body
根据 HTTP Spec
1 | A payload within a GET request message has no defined semantics |
GET request的payload是没有定义的,可以理解为C语言中的undefined behavior,文章中还提到了,
GET bodies从不被 Fetch 支持,变成了虽然支持,但是会警告开发者尽量不要用。
因为是 undefined behavior,所以 GET 请求中的 Body,理论上来讲可以被随意处理,像HackerNews
上这个 Comment 所说的:
1 | ... |
GET的body是具有不确定性的,Load Balancer理论上是可以直接丢掉Body内容的。
新Method “QUERY”有什么好处
Safe and Idempotent
Proposal Section 2
里提到的最重要的好处是safe和Idempotent。
对比POST,QUERY不应改变服务器上的内容,也就是只读请求,而且QUERY同样也应该是幂等的,
“以相同的请求调用这个接口一次和调用这个接口多次,对系统产生的影响是相同的”。
Caching
Proposal Section 2.1 所提到的,QUERY支持HTTP caching的标准。
综合来看,QUERY相当于是一个支持了Body的GET。对比传统通过POST来传Body实现复杂查询,有一些优势。
Thoughts
HTTP定义的这些方法在当前真的符合各个不同应用的需求吗,HTTP是否应该在它这一层去定义这些方法,
是否应该由一层只处理单向或双向的消息通讯协议, 其余的逻辑,由更上层的协议去做。
像GraphQL在HTTP POST之上定义自己的Query和Mutation逻辑。