首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从haskeline内调用网络IO

从haskeline内调用网络IO
EN

Stack Overflow用户
提问于 2012-06-13 10:15:26
回答 1查看 374关注 0票数 5

我有一个现有的程序,它接受命令行参数(用户名、密码、日期),然后使用Network.HTTP.Conduit库将一条xml消息发送到服务器。然后我解析结果,做一些工作,并使用blaze-html写出一个文件。

这一切都很好用;但是,我想我应该使用haskeline,这样密码就看不见了。我可以创建一个命令行程序来获取用户提供的值并将它们打印出来,但是如果我调用使用管道的函数,它永远不会返回。

下面是有问题的代码:

代码语言:javascript
复制
main = runInputT defaultSettings loop
where 
    loop :: InputT IO ()
    loop = do
        Just username <- getInputLine "WM username: "
        Just password <- getPassword (Just '*') "WM password: "
        Just date     <- getInputLine "Date (YYYYMMDD): "

        outputStrLn "querying WM..."
        clients <- lift $ getWMClients username password
        outputStrLn "successfully retrieved client list from WM..."

        let outHeader = renderHeader date username

        reportString <- mapM  (\x -> createString x clients)  cList

        lift $ writeFile (date ++ "_report.html") (outHeader ++ concat reportString)
        outputStrLn "Done"

function getWMClients函数为:

代码语言:javascript
复制
getWMClients :: Username -> String -> IO [Client]
getWMClients username password = do
    let f = [Size "-1", Skip "0"]
    let fs = [Select "id",
              Select "status",
              Select "last-name",
              Select "first-name",
             ]
    let query = WMQuery {transaction=SHARE,service=Query,businessObject=CONT,field=f,fields=fs}

    results <- doQuery username (Just password) Nothing (Just query)
    rows <- xmlResultsToMaps results

    let clients = map makeClient rows
    return clients

当我运行该程序时,它挂起在“查询WM...”我不认为http-conduit真的在运行。有任何关于如何使其工作的提示吗?

先谢谢你,尼尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-13 17:08:16

你声称它使用硬编码的用户名,密码,haskeline之前的日期。为了帮助调试,您可能无法将管道提升到InputT中。以下操作仍然失败吗?(这不是我编译的,所以请随意修复语法错误...)

代码语言:javascript
复制
-- Isolate the haskeline monad to just the input part:
main = loop
where 
    loop :: IO ()
    loop = do
      (username,password,date) <- runInputT defaultSettings $ do
        Just username <- getInputLine "WM username: "
        Just password <- getPassword (Just '*') "WM password: "
        Just date     <- getInputLine "Date (YYYYMMDD): "
        return (username,password,date)

      putStrLn "querying WM..."
      clients <- getWMClients username password
      putStrLn "successfully retrieved client list from WM..."

      let outHeader = renderHeader date username

      putString <- mapM  (\x -> createString x clients)  cList

      writeFile (date ++ "_report.html") (outHeader ++ concat reportString)
      putStrLn "Done"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11007383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档