Using httpspec you can write a specification for a HTTP request/response
defining the method, headers, url parameters and the body. This
specification bidirectionally maps an abstract request/response data
type to a concrete realisation as a HTTP request/response. The
specification can be used to generate HTTP requests/responses from an
abstract description and it can be used to parse a HTTP request/response
into such an abstract description. The idea is very similar to the way
pickling of XML data is described in HXT.
For example, the abstract representation of an authentication request
and response could be described as
data AuthUserReq
= AuthUserReq
{ authUser_user :: String
, authUser_pass :: String
}
data AuthUserRes
= AuthUserOk { authUserOk_sid :: String }
| AuthUserFailed
Using httpspec you can define a mapping between HTTP and these types:
instance HasReqSpec AuthUserReq where
reqSpec =
rsMeth Http.POST $
rsPath "/authenticate-user" $
rsWrap (uncurry AuthUserReq, (AuthUserReq a b) -> (a,b)) $
rsPair (rsParam "uid") (rsParam "pass")
instance HasResSpec AuthUserRes where
resSpec =
rsSwitch
[ rsCase (AuthUserOk,authUserOk_sid) $
rsStatus 200 $
rsContentType "text/plain" $
rsEncodingFixed UTF8 $
rsBody
, rsCaseConst AuthUserFailed $
rsStatus 403
]