XhrRequest с рефлексом /reflex-dom
Я хочу выполнить базовый запрос Ajax, вот и все.
я использую reflex
для внешнего интерфейса и Scotty
для бэкэнда. Веб-консоль Firefox сообщает, что запрос был успешным, и я вижу ожидаемый результат. Но сайт переключается с 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.
Я использовал скрипт Nix try-reflex из GitHub, чтобы все настроить и скомпилировал ghcjs hello.hs
в среде Nix.
Изменить: добавление вывода curl
:
$ curl -G http://localhost:3000/mystring
success!%
2 ответа
С помощью #reflex-frp
на freenode я нашел решение: замена decodeXhrResponse
с _xhrResponse_body
и используя Text
для строки по умолчанию работал:
buttonDyn <- holdDyn (Just $ T.pack "default") $ fmap _xhrResponse_body asyncEvent
decodeXhrResponse
ожидает какой-то JSON, и хотя я однажды пытался обслуживать JSON через Скотти, он все равно не работал.
Я написал эту упрощенную вспомогательную функцию для извлечения удаленного 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