【问题标题】:Writing Both session and JSON data to http.ResponseWriter将会话和 JSON 数据写入 http.ResponseWriter
【发布时间】:2014-11-25 17:35:19
【问题描述】:

是否可以将会话和一些自定义应用程序特定的 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 数据。

如何做到这一点?

【问题讨论】:

  • 我是否应该找到另一种方法来通知客户端登录案例,通过这种方式我制作客户端代码来决定要呈现哪个模板。就像从客户端的浏览器收集cookie存储,我目前不知道如何?
  • 我认为你可以,但我对具体的包不够熟悉,无法写出完整的答案。您可能必须先设置 cookie/会话数据,因为像 Set-Cookie 这样的标头会在 Writes 之前被清除。

标签: json session go gorilla


【解决方案1】:

是的,你可以两者都写。与会话关联的 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
}

【讨论】:

  • 谢谢,它有效。只有在这种情况下,如果用户刷新了通常不打算使用该应用程序的页面,而只是为了查看会话效果,我实现的只是将 json 提供给屏幕上的客户端,页面组件就消失了。
  • 现在我已经解决了最后一个问题。我在我的相关模型中使用initialize: function(){ this.fetch(); }, 在获取请求时向服务器询问相关会话变量的状态。并且服务器相应地回答会话值是否存在。设置 JSON 并让 js 决定向用户显示什么。只有它需要我将字符串阅读器更改为字节阅读器,以便从正文中收集 json 作为 []byte 并将其放入结构中以在 Go 中用于字符串“false”不是 Go 布尔值。谢谢@Dewy。也感谢@OneofOne。
【解决方案2】:

季节一般都是以cookies的形式存储的,所以是作为header发送的,需要先保存再写入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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多