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

Go HTTP GET 请求可以发送 body 吗

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

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

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

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

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

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

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

RFC7231 怎么说

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

如下摘抄:OfQ28资讯网——每日最新资讯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.OfQ28资讯网——每日最新资讯28at.com

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

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

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

程序支持程度

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

如下 Go 代码:OfQ28资讯网——每日最新资讯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 进行测试:OfQ28资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

总结

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

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

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

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

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

对应的 CURL:OfQ28资讯网——每日最新资讯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 对此都会忽略或出现报错。OfQ28资讯网——每日最新资讯28at.com

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

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

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

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

参考资料

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

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

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

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

上一篇: Python VTK 初探数据源

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

标签:
  • 热门焦点
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
Top