0

Spock で実行されている Web サーバー (たとえば、localhost) でバイト文字列本体を視覚化します。

私の目標: Web サイトを作成し、バイト文字列 (テキストに変換) を表示します。 JSON 構造。一般的な考え方は、応答本文を使用して、restAPI Web サイトに送信される JSON クエリ構造 (ユーザーが質問を作成できる) を作成することです。

私はこのようなリクエストを作成することができます:

    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 モナドを続けます。

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" と同じ)ハンドラー (たとえば、のテキスト関数のようにdo get ... $ text -> ActionCtxT ctx m a) であり、main()runSpock 8080 (spock spockCfg app1) の spock関数によって処理する必要があります。のHtml ()私が研究した多くの例に現れて機能するタイプ。すべての解析とリクエストの構築は HTTP.Simple で行われます (あまりエレガントではありませんが、たとえば、動作する必要があることはわかっています)。これはlucidIOまでエスケープできません-間違ったMonadを選択している可能性があります(つまり、IO:しかし、IOを使用すると、ghciのすべてをチェックできます)。この ByteString をブラウザに出力する方法のヒントを教えてください。

4

1 に答える 1