2014-09-30 29 views
1

是否可以將會話和一些自定義應用程序特定的json數據發送到Go的客戶端表單net/http包。將會話和JSON數據寫入http.ResponseWriter

我正在使用大猩猩/會話進行會話。在存儲值之後,需要調用func(s * CookieStore)保存(r * http.Request,w http.ResponseWriter,session * Session)錯誤。

但另一方面,此處理函數還需要通過fmt.Fprintf(http.ResponseWriter,string(js))將一些JSON數據發送到客戶端。

這是如何實現的?

+0

我應該找到另一種方式來通知登錄的情況下的客戶端,由我做客戶端的代碼來決定要渲染的模板。就像在客戶端從瀏覽器收集cookie存儲一樣,目前我不知道該如何操作? – 2014-09-30 23:30:59

+0

我認爲你可以,但我不熟悉具體的軟件包寫出一個完整的答案。您可能必須首先設置cookie /會話數據,因爲在寫入之前,像Set-Cookie這樣的頭文件會被刷新掉。 – twotwotwo 2014-09-30 23:31:42

回答

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 
} 
+0

謝謝,它的工作原理。只有在這種情況下,如果用戶通常刷新不打算使用該應用程序的頁面,但僅僅看到會話實際上我所做的只是將json提供給屏幕上的客戶端,並且頁面組件不見了。 – 2014-10-01 00:12:58

+0

現在我已經解決了最後一個問題。我使用'initialize:function(){this.fetch();}}。 \t \t},'在我的相關模型中請求服務器獲取請求相關會話變量的狀態。並且服務器相應地回答是會話值存在。設置JSON並讓js決定向用戶顯示什麼。只有它需要我將字符串閱讀器更改爲字節閱讀器,才能將正文中的json從[]字節收集爲[]字節,並將其放入Go中用於字符串「false」的結構中不是Go boolean。謝謝@Dewy。也感謝@OneofOne。 – 2014-10-01 00:43:37

1

四季存儲爲餅乾,所以它被作爲標題,你需要保存它首先然後再編寫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 
    } 
}