2015-05-15 9 views
7

Desidero eseguire una richiesta Ajax di base, tutto qui.XhrRequest con reflex/reflex-dom

Io uso reflex per il frontend e Scotty per il backend. La Web Console di Firefox mi dice che la richiesta è stata un successo e vedo i risultati attesi lì. Tuttavia, il sito Web passa da Just "default" a Nothing anziché a Just "success!".

Ecco un completo esempio minimo:

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 

e la Scotty parte:

{-# 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!" 

Poiché gli strumenti di debug mi dicono la richiesta è stata un successo, ho il sospetto che l'errore da qualche parte vicino decodeXhrResponse ma Sono un po 'perso come dovrei procedere con il debug poiché viene appena compilato per Javascript (illeggibile).

Ho utilizzato lo script try-reflex Nix di GitHub per configurare tutto e compilato con ghcjs hello.hs nell'ambiente Nix.

Edit: Aggiunta l'uscita del curl:

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

risposta

6

Con l'aiuto #reflex-frp su freenode ho trovato una soluzione: sostituendo decodeXhrResponse con _xhrResponse_body e utilizzando Text per la stringa predefinito lavorato:

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

decodeXhrResponse si aspetta una sorta di JSON e nonostante abbia provato a servire JSON tramite Scotty a un certo punto non ha funzionato.