7

我想执行一个基本的 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 脚本来设置所有内容并ghcjs hello.hs在 Nix 环境中编译。

编辑:添加输出curl

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

2 回答 2

6

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

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

decodeXhrResponse期望某种 JSON,尽管我曾尝试通过 Scotty 提供 JSON,但它仍然无法正常工作。

于 2015-05-17T18:36:08.560 回答
0

我编写了这个简化的辅助函数来从 reflex 中检索远程 URL:

curlGet :: MonadWidget t m => Text -> m (Event t Text)
curlGet url = do
  let req = xhrRequest "GET" url def
  pb <- getPostBuild
  asyncReq <- performRequestAsync (tag (constant req) pb)
  pure $ fmap (fromMaybe "Unknown error" . _xhrResponse_responseText) asyncReq
于 2018-07-08T23:45:54.447 回答