[Haskell-cafe] haskell; json-rpc

Комар Максим mk at mtw.ru
Tue Jul 5 09:28:19 CEST 2011


Apologize in advance for the English language.

I'm working with json-rpc interface (http://json-rpc.org/) via http.
Requests and responses look like this:
-> {"jsonrpc" : "2.0", "id" : "1", "method" : "user.authenticate", 
    "params" : { "user" : "myUser", "password" : "myPassword" }}
        
<-
{"jsonrpc":"2.0","result":"97d4b59d2f2fbf703bb7aa257aae5254","id":"1"}

-> {"jsonrpc" : "2.0", "id" : "2", "method" : "user.getObjects", 
    "auth" : "97d4b59d2f2fbf703bb7aa257aae5254", 
    "params" : { "alias" : "myUser" }}
    
<-
{"jsonrpc":"2.0","result":[{"userid":"3","alias":"myUser","name":"lala",
"surname":"lala","passwd":"c5aba41f671a02a3c8a6f10a2a7d8a19",
"url":"myUrl","autologin":"1","autologout":"0","lang":"ru_ru",
"refresh":"30","type":"1","theme":"css_bb.css","attempt_failed":"0",
"attempt_ip":"0.0.0.0","attempt_clock":"1282502966",
"rows_per_page":"50"}],"id":"2"}


How can i describe in Haskell my task? 

P.S. The first request is required for authentication (field "auth" in
the following queries). Using the second query, I want to know
"userid").

P.P.S. My first approach is to describe rpc query as following:
data RpcQuery = RpcQuery {
        rpcVersion :: String,
        rpcId :: String,
        rpcMethod :: String,
        rpcAuth :: String,
        rpcParams :: AuthUser
} deriving (Show)

data AuthUser = AuthUser {
        authUser :: String,
        authPassword :: String
        } deriving (Show)

instance JSON AuthUser where
        showJSON au = makeObj
                [ ("user", showJSON $ authUser au)
                , ("password", showJSON $ authPassword au)
                ]
        
        readJSON (JSObject obj) = let
                        jsonObjAssoc = fromJSObject obj
                in do   
                        user <- mLookup "user" jsonObjAssoc >>= readJSON
                        password <- mLookup "password" jsonObjAssoc >>=
readJSON
                        return $ AuthUser
                                { authUser = user
                                , authPassword = password
                                }

        readJSON _ = fail ""

But this scheme is not extended.




More information about the Haskell-Cafe mailing list