V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wwvvance
V2EX  ›  Go 编程语言

go net/http header 的使用疑问

  •  
  •   wwvvance · 2023-05-08 09:52:40 +08:00 · 1501 次点击
    这是一个创建于 570 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在使用 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 的语法特点导致的么?
    5 条回复    2023-05-09 09:22:48 +08:00
    aladdinding
        1
    aladdinding  
       2023-05-08 09:58:14 +08:00
    因为 http header 可以重复多次 比如 cookie
    baiyi
        2
    baiyi  
       2023-05-08 10:08:22 +08:00   ❤️ 2
    1. 因为 http header 就是设计成了这样的结构,值可以是数组。但并不代表所有 header 的值都必须支持数组配置,有些 header key 设计出来就只有一个字符串值
    2. 基于上述设计理念,go header 结构体的辅助方法就很好理解了,Add 的场景就是为了给数组型 value 使用的,Set 是给字符串型 value 使用的,Get 也是
    3. 在实际使用过程中,需要使用者明白当前你想使用的 header key 支持什么类型的 value ,假如是数组,那么就遍历,假如是字符串,那么直接用辅助方法 Get 就好
    darksword21
        3
    darksword21  
       2023-05-08 10:51:37 +08:00
    Add:添加新 header
    Set:设置现有 header 的 value
    hzzhzzdogee
        4
    hzzhzzdogee  
       2023-05-08 23:12:55 +08:00
    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
        5
    wwvvance  
    OP
       2023-05-09 09:22:48 +08:00
    @hzzhzzdogee 里面的注释我也读过, 应该就是我对 http header 设计的知识不足, 要查缺补漏.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1074 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 20:00 · PVG 04:00 · LAX 12:00 · JFK 15:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.