gpt4 book ai didi

haskell - 使用 reflex/reflex-dom 的 Xhr 请求

转载 作者:行者123 更新时间:2023-12-01 18:44:12 31 4
gpt4 key购买 nike

我想执行一个基本的 Ajax 请求,仅此而已。

我使用 reflex 作为前端,使用 Scotty 作为后端。 Firefox Web 控制台告诉我请求成功,我在那里看到了预期的结果。但网站从Just“default”切换为Nothing,而不是Just“success!”

这是一个完整的最小示例:

import Reflex (holdDyn)
import Reflex.Dom (button, el, mainWidget, display)
import Reflex.Dom.Xhr (performRequestAsync, xhrRequest, decodeXhrResponse)
import Reflex.Class (tag, constant)
import Data.Default (def)

main :: IO ()
main = do
mainWidget $ el "div" $ do
buttonEvent <- button "click me"
let defaultReq = xhrRequest "GET" "mystring" def --served by Scotty
asyncEvent <- performRequestAsync (tag (constant defaultReq) buttonEvent)
buttonDyn <- holdDyn (Just "default") $ fmap decodeXhrResponse asyncEvent
display buttonDyn

Scotty部分:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.Static

main = scotty 3000 $ do
middleware $ staticPolicy (noDots >-> addBase "/mnt/b/haskell/try-reflex/hello.jsexe")
get "/" $ do
file "/mnt/b/haskell/try-reflex/hello.jsexe/index.html"
get "/mystring" $ html "success!"

由于调试工具告诉我请求成功,我怀疑在 decodeXhrResponse 附近有错误,但我有点迷失了应该如何进行调试,因为它只是被编译为(不可读的)Javascript .

我使用 GitHub 上的 try-reflex Nix 脚本来设置所有内容,并在 Nix 环境中使用 ghcjs hello.hs 进行编译。

编辑:添加curl的输出:

$ curl -G http://localhost:3000/mystring
success!%

最佳答案

在 freenode 上的 #reflex-frp 的帮助下,我找到了一个解决方案:用 _xhrResponse_body 替换 decodeXhrResponse 并使用 Text 为默认字符串:

buttonDyn <- holdDyn (Just $ T.pack "default") $ fmap _xhrResponse_body asyncEvent

decodeXhrResponse 需要某种 JSON,尽管我曾经尝试通过 Scotty 提供 JSON,但它仍然不起作用。

关于haskell - 使用 reflex/reflex-dom 的 Xhr 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30264504/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com