go net/http header 的使用疑问

364 天前
 wwvvance

在使用 go "net/http" 创建一个 http.Request 去上传文件到 minio 的过程中, 发现了几个疑问点:

  1. 为什么 Header 是一个 map[string][]string, 虽然我看了网上一些讨论 https://www.reddit.com/r/golang/comments/cgbkel/why_are_headers_mapstringstring/ 但也不太理解,
  2. Header 的 Add 跟 Set 的实际使用场景上的区别是? 为什么 Header 的值是个切片, 但 Get 却只返回第一个元素,
  3. 基于 2, 在实际使用过程中, 应该如何读取 Header 的值, 是遍历 Header 后使用键去 Get 还是直接使用值, 我觉得类型 Header 是非私有的会造成使用上的疑惑(・∀・(・∀・(・∀・*), 这是 go 的语法特点导致的么?
1274 次点击
所在节点    Go 编程语言
5 条回复
aladdinding
364 天前
因为 http header 可以重复多次 比如 cookie
baiyi
364 天前
1. 因为 http header 就是设计成了这样的结构,值可以是数组。但并不代表所有 header 的值都必须支持数组配置,有些 header key 设计出来就只有一个字符串值
2. 基于上述设计理念,go header 结构体的辅助方法就很好理解了,Add 的场景就是为了给数组型 value 使用的,Set 是给字符串型 value 使用的,Get 也是
3. 在实际使用过程中,需要使用者明白当前你想使用的 header key 支持什么类型的 value ,假如是数组,那么就遍历,假如是字符串,那么直接用辅助方法 Get 就好
darksword21
364 天前
Add:添加新 header
Set:设置现有 header 的 value
hzzhzzdogee
364 天前
Add adds the key, value pair to the header. It appends to any existing values associated with key. Set sets the header entries associated with key to the single element value. It replaces any existing values associated with key.
wwvvance
363 天前
@hzzhzzdogee 里面的注释我也读过, 应该就是我对 http header 设计的知识不足, 要查缺补漏.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/938150

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX