这个问题在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教程让我觉得必须有更好的方法。
答案 0 :(得分:0)
在snaplet教程的“使用状态”部分中,他们解释了如何使用本地状态。如果您查看上面名为“Snaplet Overview”的部分中的第二个代码段,您可以看到它们在使用Lens初始化数据类型时如何设置状态。
不确定您对这些事情的熟悉程度,但Lens
允许您以较大的值访问(即读/写/调整)数据片段。在这种情况下,服务器的整个状态表示为一个数据blob(记录类型值),它在服务器时初始化。
请注意:_companyName :: IORef B.ByteString
&lt; - 是一个状态,您可以在示例中进行变异,并在“使用状态”部分中进行变更,这正是他们所做的。他们有一个示例,它接受HTTP GET或POST到该URL,并使用新的“name”参数(POST)更新它并返回新状态,或者如果它是GET,它只返回当前状态。