2

是否可以将会话和一些自定义应用程序特定的 json 数据发送到 Go 的客户端表单 net/http 包。

我正在使用 gorilla/sessions 进行会话。并且存储值后,需要调用 func(s *CookieStore) Save(r *http.Request, w http.ResponseWriter, session *Session) 出错。

但另一方面,这个处理函数也需要通过 fmt.Fprintf(http.ResponseWriter, string(js)) 向客户端发送一些 JSON 数据。

如何做到这一点?

4

2 回答 2

1

季节通常存储为 cookie,因此它作为标头发送,您需要先保存它然后写入您的 json 数据。

此外,您应该考虑使用json.Encoder而不是json.Marshal.

func handler(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session")
    // stuff with session
    session.Save(r, w)
    w.Header().Set("Content-Type", "application/json")
    enc := json.NewEncoder(w)
    if err := enc.Encode(somedatastruct{}); err != nil {
        //handle err
    }
}
于 2014-09-30T23:40:20.620 回答
0

是的,你可以两者都写。与会话关联的 cookie 被写入响应标头。JSON 数据被写入响应正文。请务必先保存会话,因为一旦应用程序开始写入响应正文,对响应标头的更改将被忽略。

假设 r 是 *http.Request,w 是 http.ResponseWriter,d 是包含 JSON 的 []byte,那么您应该:

session.Save(r, w)
w.Write(d)

如果您使用的是标准 encoding/json 包,那么您可以直接编码到响应正文。此外,您应该设置内容类型。

session.Save(r, w)
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(yourData); err != nil {
   // handle error
}
于 2014-09-30T23:37:35.267 回答