当前位置:首页 > 科技  > 软件

Go HTTP GET 请求可以发送 body 吗

来源: 责编: 时间:2023-11-28 09:36:02 386观看
导读大家好,我是煎鱼。前段时间遇到一个朋友,他跟我说他们在开发一个 Go 项目时,遇到了一个争议点,说来也好理解。WEB UI 端选择 GET、POST 类型时,程序是否要区分所传递的值(例如:Body),还是不管是什么类型都传。图片一派认为无所

大家好,我是煎鱼。u8d28资讯网——每日最新资讯28at.com

前段时间遇到一个朋友,他跟我说他们在开发一个 Go 项目时,遇到了一个争议点,说来也好理解。WEB UI 端选择 GET、POST 类型时,程序是否要区分所传递的值(例如:Body),还是不管是什么类型都传。u8d28资讯网——每日最新资讯28at.com

图片图片u8d28资讯网——每日最新资讯28at.com

一派认为无所谓,反正都能传。又没限制。u8d28资讯网——每日最新资讯28at.com

一派认为规范如此,不应该传。应该针对 HTTP POST 类型,使用 POST 请求的 body 来传递参数。在 GET 请求里使用 URI 来进行参数传递。u8d28资讯网——每日最新资讯28at.com

看着似乎都有各自的道理,僵持不下。u8d28资讯网——每日最新资讯28at.com

RFC7231 怎么说

要看互联网协议的相关标准,必然是 RFC 了。首先看看 RFC7231[1] 中的 4.3.1 小节是怎么说的。u8d28资讯网——每日最新资讯28at.com

如下摘抄:u8d28资讯网——每日最新资讯28at.com

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.u8d28资讯网——每日最新资讯28at.com

大概意思:在 GET 类型的请求里使用 body 是一个没有定义的语义。如果在 GET 请求的 body 里传递参数可能会被某些实现方拒绝该请求。u8d28资讯网——每日最新资讯28at.com

也就是这个混着传的行为并不符合 RFC 规范,至少官方是不推荐不鼓励这样的使用方式。但并没有禁止这个行为。u8d28资讯网——每日最新资讯28at.com

记住这个结论。接下来我们进行测试。u8d28资讯网——每日最新资讯28at.com

程序支持程度

我们起一个 HTTP Sever 用于测试和验证,看看在具体的编程语言的实现中是否可以支持。u8d28资讯网——每日最新资讯28at.com

如下 Go 代码:u8d28资讯网——每日最新资讯28at.com

func hello(w http.ResponseWriter, req *http.Request) { b, _ := io.ReadAll(req.Body) w.Write(b)}func main() { http.HandleFunc("/hello_world", hello) http.ListenAndServe(":7001", nil)}

在命令行执行 CURL 进行测试:u8d28资讯网——每日最新资讯28at.com

$ curl -X GET localhost:7001/hello_world -d '煎鱼'煎鱼

看来在 Go 里面是可以的。u8d28资讯网——每日最新资讯28at.com

那既然 RFC 没有禁止,Go 的测试也正常。看来就是只是口头上的 “不鼓励” 和 “不推荐” 吗?u8d28资讯网——每日最新资讯28at.com

那别的场景也都支持吗?u8d28资讯网——每日最新资讯28at.com

实际上也不是,例如:XMLHttpRequest 规范[2] 中有明确提到:u8d28资讯网——每日最新资讯28at.com

图片图片u8d28资讯网——每日最新资讯28at.com

如果请求方法为 GET 或 HEAD,body 参数会被忽略。u8d28资讯网——每日最新资讯28at.com

总结

在 GET 类型里传 body 参数,从 RFC7231 标准来定义。官方是不推荐、不鼓励这么去使用的。u8d28资讯网——每日最新资讯28at.com

但是呢,这是一个没有明确禁止的事。u8d28资讯网——每日最新资讯28at.com

而从各个 HTTP 实现的客户端来看,一开始还是有不少不支持的。但掰扯了好多年后,大多数都支持了。(毕竟用户的诉求也是很重要的)u8d28资讯网——每日最新资讯28at.com

甚至印象最深的,ES 直接就在 GET 请求里传了 body:u8d28资讯网——每日最新资讯28at.com

图片图片u8d28资讯网——每日最新资讯28at.com

对应的 CURL:u8d28资讯网——每日最新资讯28at.com

curl -X GET "localhost:9200/my-index-000001/_search?from=40&size=20&pretty" -H 'Content-Type: application/json' -d'{  "query": {    "term": {      "user.id": "kimchy"    }  }}'

但也有不支持的,例如在 Chrome 浏览器下测试 XMLHttpRequest、Fetch 对此都会忽略或出现报错。u8d28资讯网——每日最新资讯28at.com

图片图片u8d28资讯网——每日最新资讯28at.com

Fetch GET bodyu8d28资讯网——每日最新资讯28at.com

结论上来讲,GET 请求能不能传 body,这是一个 RFC 规范不鼓励。但是实现方大部分都支持的一个情况。u8d28资讯网——每日最新资讯28at.com

企业和团队内部的话,建议达成研发规范的共识即可。不过我个人而言,都会区分开。u8d28资讯网——每日最新资讯28at.com

参考资料

[1]RFC7231: https://datatracker.ietf.org/doc/pdf/rfc7231.pdfu8d28资讯网——每日最新资讯28at.com

[2]XMLHttpRequest 规范: https://xhr.spec.whatwg.orgu8d28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34642-0.htmlGo HTTP GET 请求可以发送 body 吗

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python VTK 初探数据源

下一篇: 用Python Requests库轻松实现网络爬虫,学会抓取数据!

标签:
  • 热门焦点
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼‍‍‍‍‍‍‍‍‍‍东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top