[Haskell-cafe] Where to start about writing web/HTTP apps ?
S. Alexander Jacobson
alex at alexjacobson.com
Mon Sep 12 15:54:23 EDT 2005
I will be launching (beta) a new commercial chat site written using
Haskell and AJAX in the next month. The server is written on top of
the HAppS library I made available at http://HappS.org.
My general pattern for writing an application in this framework is
write the server based on a wire-level spec where the server takes in
XML/x-www-form-encoded/multipart-form-data and returns XML. Client
side XSLT stylesheets then handle conversion of the XML to HTML. Here
are the details if you are interested:
1. Write a web service spec as a reference for both client and server
development. I use an informal language for this that relies on a
mix of the reader understanding HTTP semantics and RelaxNG XML specs.
POST /login ? {username {text},password{text},url{URL},captcha(text}}
200 session {attribute userId{text},attribute href {rel-URL}}
Some text here describing other details that don't fit into the
syntactic model described above. Server is assumed to handle any of
application/x-www-form-urlencoded, multipart/form-data, or
application/xml. Client is assumed to receive application/xml.
Browser is assumed to handle XSL stylesheet PIs. (All conversion
from XML to HTML is handled client side or on proxy using XSLT
template)
2. Define Server State and state model
data State = State {users::UserData}
...definition of user data...
startState = State mzero
addStateUser state user = ....
3. Define serialization for server state
instance Show State where ...
instance Read State where ---
4. Define exposed business logic
addUser appCtx regInfo = if regGood then actionOk newState [] newUserInfo
else qOk badRegInfo
...
5. define required wire formats for types
--convert internal data type to XML
instance ToElement NewUserInfo where
toElement n = ...
--convert posted data to internal data type
instance FromMessage RegInfo where
fromMessage msg = ...
6. define how busines logic maps to URLs
...
a POST _ ["u"] = doXML addUser
a GET "myapp.com" ("s":path) = fileServe mimeTypes "static" path
myApp appCtx = let ?style=XSL "/s/style.xsl" in simpleHTTP a appCtx
7. define the app to execute
run path host = do
app <- startApp $ simpleConfig path startState confro
serve host app
return ()
main = run "appdir" "localhost:80"
8. put client side stuff (including style.xsl) in the "static" directory
9. install searchpath (see http://searchpath.org)
10 run it!
$ searchPath ghc -o MyApp --internet http://searchpath.org/default.map src/MyApp.hs
$ MyApp
HAppS and the chat applications are still works in progress, but I
have this running successfully internally already!
-Alex-
______________________________________________________________
S. Alexander Jacobson tel:917-770-6565 http://alexjacobson.com
On Mon, 12 Sep 2005, Sam Mason wrote:
> gary ng wrote:
>> I want to write apps for WEB and have briefly read
>> WASH.
>
> I'm thinking of doing the same. The approach taken by WASH seems very
> cool and I'd love to use it. I've only started looking at it, but
> WASH seems to require that JavaScript be enabled on the user's web
> browser, even for the simplest forms. e.g. from the authors web page:
>
> http://nakalele.informatik.uni-freiburg.de/cgi/WASH/Counter.cgi
>
> Also, the error checking doesn't seem to work as I'd expect: if
> you submit a page without a required field it will complain the
> first time, then make something up the second time around -- even
> if you haven't entered anything in the field.
>
>
> Sam
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list