如何使用 Go/WASM 获取所有标头和 cookie

Posted

技术标签:

【中文标题】如何使用 Go/WASM 获取所有标头和 cookie【英文标题】:How to get all headers & cookies with Go/WASM 【发布时间】:2021-10-09 20:43:46 【问题描述】:

我正在尝试使用 Go 的 net/http 包从 Go/wasm 发送请求(我不确定是否应该使用来自 wasm 的 javascript 的 fetch 函数)。即使我可以正确看到浏览器上的所有标头和 cookie(在浏览器的网络选项卡上,我也可以看到所有带有 curl 请求的标头),但我无法从 Go/WASM 访问所有响应标头和 Cookie。当我尝试打印所有标题时,我只能在控制台上看到 2 个标题。它们是 "Content-Length" 和 "Content-Type" 。有人知道这是什么原因吗?

这是服务器端的示例代码:

import "github.com/gorilla/sessions"

var store = sessions.NewCookieStore([]byte("super-secret-key-4"))

func (a *App) TestHandler(w http.ResponseWriter, r *http.Request) 
    cookieSession, _ := store.Get(r, "session")
    cookieSession.Values["test"] = "test"
    cookieSession.Save(r, w)
    w.Header().Set("Test", "test")
    io.WriteString(w, `"test":"test"`)
    return

客户端:

func TestRequest(userName string) 

    type Payload struct 
        Name string `json:"name"`
    
    payload := Payload
        Name: userName,
    
    payloadBytes, _ := json.Marshal(payload)
    body := bytes.NewReader(payloadBytes)
    req, _:= http.NewRequest("POST","localhost:8080/Test", body)
    req.Header.Set("Content-Type", "application/json")
    resp, _:= http.DefaultClient.Do(req)
    //a, _ := ioutil.ReadAll(resp.Body)
    //bodyString := string(a)

    for name, values := range resp.Header 
        for _, value := range values 
            log.Println(name, value)
        
    
    for _, cookie := range resp.Cookies() 
      log.Println(cookie.Name)
    
    defer resp.Body.Close()

这是我在浏览器控制台上得到的:

wasm_exec.js:51 2021/08/04 21:08:48 Content-Length 274
wasm_exec.js:51 2021/08/04 21:08:48 Content-Type text/plain; charset=utf-8

【问题讨论】:

【参考方案1】:

我终于看到我需要在响应中添加一个特殊的标头,以便在客户端使用我的自定义标头。如果我将此行添加到我的中间件,我可以在客户端看到我的自定义标头。

w.Header().Set("Access-Control-Expose-Headers", "MyHeader,Myheader2")

【讨论】:

以上是关于如何使用 Go/WASM 获取所有标头和 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Angular 2 响应中获取所有标头?

ASP.Net Core 2.0 如何获取中间件中的所有请求标头? [复制]

如何从 fetch 中获取响应的标头

如何从 HttpResponseMessage 中获取特定的标头值

如何从HttpResponseMessage获取特定的标头值

从 libevent 中的 HTTP 服务器响应中获取所有 HTTP 标头