[英]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.