[英]How do I store some object on server-side with Snap Framework?
該問題已在2010年提出,但我認為今天可能會有更好的答案。 基本上,我需要存儲某種對象並在每個請求中訪問它,理想情況下,我希望能夠在請求中更改該對象(我想MVar或IORef可以做到這一點)。
snaplet教程似乎表明有可能,但是它主要說明了如何使用snaplet(畢竟這是該教程的目的),並且並沒有真正解釋該“ App”對象的工作方式或存儲方式。 我不知道如何將其應用到我不需要Snaplet的情況下(我正在制作API,因此甚至不需要Heist)。
所以給定默認代碼:
site :: Snap ()
site = do
ifTop (writeBS "hello world") <|>
route [ ("stuff/:param", someHandler) ] <|>
dir "static" (serveDirectory ".")
如何更改此設置以“在某些地方可以在someHandler中使用”某個對象“注冊”? 2010年的答案是將其部分應用到每個處理程序,這將起作用,但是Snaplet教程使我認為必須有更好的方法。
在snaplet教程的“使用狀態”一節中,他們解釋了如何使用本地狀態。 如果您在上面的“快照概述”部分中查看第二段代碼,則可以看到他們使用Lens初始化其數據類型時如何設置狀態。
不知道您對這些東西有多熟悉,但是Lens
允許您訪問(即讀/寫/調整)較大值內的數據。 在這種情況下,服務器的整個狀態表示為一個數據塊(記錄類型值),該數據塊在服務器處於初始化狀態時被初始化。
請注意以下_companyName :: IORef B.ByteString
: _companyName :: IORef B.ByteString
<-是一種狀態,您可以在示例中_companyName :: IORef B.ByteString
,而在“使用狀態”部分中,它們正是這樣做的。 他們有一個使用HTTP GET或POST到該URL的示例,並使用新的“名稱”參數(POST)更新它並返回新狀態,或者如果它是GET,則僅返回當前狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.