最近在跟后端联调接口的时候发现后端给了个get接口,参数竟然是放在body里面。不由得疑惑了起来,get还能有body???一般不都是直接跟着url作为query参数的咩。
工作那么久第一次碰到get请求带body的,然后我就开始怀疑这个后端是不是不大专业,打算去找下文档告诉他get是不能有body的。一百度才发现,哇擦嘞,原来get是可以有body的,只是不推荐这么用。
HTTP开发手册上对于get请求方法有这么一段描述
[RFC7231]
A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.
翻译过来就是 带有请求体的get请求信息存在未定义的语义,发送带有body的get请求将会导致某些现有实现拒绝该请求。也就是说在get请求里带body存在风险,有风险的事情咱还是少干为妙。
还有一段关于get请求缓存的描述如下:
The response to a GET request is cacheable; a cache MAY use it to satisfy subsequent GET and HEAD requests unless otherwise indicated by the Cache-Control header field ([Section 5.2 of [RFC7234]](https://tools.ietf.org/html/rfc7234#section-5.2)).
在没有指定请求头中的Cache-Control字段时,get和head请求是有缓存的。
事情到了这里,变成了我被打脸。。。不死心的我就跑去问后端能不能改成post,他说他们项目的规范就是这样,读用get,写用post或put。这。。。好吧,我只能硬上了,本地试了下发现调用的时候前端竟然报错 Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body,看来我们项目的fetch方法(isomorphic-unfetch 库)有限制,get和head方法不支持body参数。酱紫就没法搞了,只能推后端改了。(PS: 最新的postman是支持get请求带body)