簡體   English   中英

在 Spock Web 服務器上打印字節串

[英]Print bytestrings on Spock Web Server

在 Spock 上運行的網絡服務器上可視化字節串主體(例如 localhost)

我的目標:創建網站並查看字節串(轉換為文本)框架:Http Simple 用於為我的服務器執行對 restAPI Spock 的請求我不想創建 JSON,因為我需要在創建之前操作/檢查我的響應JSON 結構。 總體思路是,我想使用響應正文來構建一個 JSON 查詢結構(用戶將能夠編寫他的問題),然后將其發送到 restAPI 網站。

我設法建立一個這樣的請求:

    connect = do
        request' <- (parseRequest "http://localhost")
        let request = setRequestMethod "POST"
                    $ setRequestHost (S8.pack ("xx.xxx.xxx.xxx"))
                    $ setRequestPath "/api/Integration/Login"
                    $ setRequestBodyJSON me
                    $ setRequestPort 1000
                    $ request'
        response <- httpJSON request
        return (getResponseBody response :: Auth)

然后我用它來查詢 API 頁面

getRequest :: RequestPath -> HtmlT IO L.ByteString
getRequest rpath = do
        atoken <- liftIO connect
        request' <-  liftIO (parseRequest "http://localhost")
        let request = setRequestMethod "POST"
                    $ setRequestHost (S8.pack ("xx.xxx.xxx.xxx"))
                    $ setRequestPort 1000
                    $ setRequestPath (S8.pack ("/api/Integration/" ++ rpath))
                    $ addRequestHeader hAuthorization (S8.pack (unpack (token_type (atoken)) ++ " " ++ unpack (access_token (atoken))))
                    $ setRequestBodyJSON r1
                    $ request'
        response <- httpLBS request
        return (getResponseBody (response))

然后我跟隨一個簡短的 SpockM monad:

app1 = do get root $ text "root"
          fct 

fct 等於

fct = do get "/further" $ lucidIO ( fmap TL.decodeUtf8 (getRequest "GetProperties"))

一切都編譯得很好我什至可以在 GHCI 中看到結果,調用如下: connect >>= (\\ x -> print x) (與 getRequest "GetProperties" 相同)我不明白的是 lucidIO 應該給我一個ActionCtxtT ctx mb 類型,它完全適合處理程序的類型(例如像do get ... $ text -> ActionCtxT ctx ma的 text 函數)並且應該由 main() 中的 spock 函數處理,即runSpock 8080 (spock spockCfg app1)我試圖擺脫 ByteString 'ending' 類型,將其替換為 () 以盡可能模仿Html ()類型,該類型在我研究的許多示例中出現並起作用。 所有的解析和請求構建都是使用 HTTP.Simple 完成的(我知道它不是很優雅,例如它只需要工作),它將我從一個 monad 中拉出來(由於第一個函數 'parseRequest' -> m Request)從在 lucidIO 之前我無法逃脫 - 可能是我選擇了錯誤的 Monad(即 IO:但使用 IO 我可以檢查 ghci 中的所有內容)。 你能給我一些關於如何在我的瀏覽器中打印這個 ByteString 的提示嗎?

所以最后我實現了我想要的 - 哇,我真的為我感到驕傲......好吧,對於那些尋找同樣事情的人,我設法做的事情,回顧一下我的主要問題是逃避 IO monad (我的選擇可能並不聰明,但仍然如此)由於使用來自 HTTP.simple 庫的請求解析器,我陷入了困境。 我的代碼略有變化,但總體思路保持不變:

構建響應查詢:

getResponseMethod  :: RequestPath -> RequestBody -> IO (Maybe Value) 

多虧了解碼功能(aeson 包)從中獲得了一個 Maybe 值(包裝在 IO 中,但沒關系)

然后是我的小 spock 服務器:

main :: IO ()
main = do
    spockCfg <- defaultSpockCfg () PCNoDatabase ()
    runSpock 8080 (spock spockCfg app)

我做了很多工作來擁有正確的app -> SpockM () () () ()我從我們可以想象的最簡單的應用程序開始:

app = do get root $ text "Hello!"

注意到 text 函數正在生成MonadIO m => ActionCtxT cxt ma monad所以我的想法是,如果我“撒上”一些聰明的 LiftIO 東西,它應該可以完成這項工作。

我創建了一個輔助函數:

extrct :: MonadIO m => ActionCtxT ctx m Text 
extrct = liftIO $ do
     a <-  getResponseMethod "GetProperties" r1
     return (pack $ show a)

並用一只手來調整我的應用程序

app :: SpockM () () () ()
app = do get root $ do
            a <- extrct
            text a

最后我能夠在我的 spock 本地網絡服務器上看到 Maybe Value :: JSON 的字符串表示。 這就是我一直在尋找的。 現在我可以清理我的代碼了。 據我了解,使用liftIO會將IO monad放在Monad Stack中的正確位置,因為IO總是在底部?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM