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
Другие вопросы по тегам