将会话和JSON数据写入http.ResponseWriter

时间:2014-09-30 23:28:08

标签: json session go gorilla

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

如何实现这一目标?

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

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

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

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

如果您使用标准编码/ json包,则可以直接编码到响应主体。此外,您应该设置内容类型。

session.Save(r, w)
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(yourData); err != nil {
   // handle error
}