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

Go HTTP GET 请求可以发送 body 吗

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

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

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

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

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

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

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

RFC7231 怎么说

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

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

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

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

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

程序支持程度

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

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

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

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

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

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

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

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

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

总结

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

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

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

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

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

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

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

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

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

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

参考资料

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

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

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

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

上一篇: Python VTK 初探数据源

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

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top