2013-03-12 2 views
1

나는 haskell에서 yesod 프레임 워크를 사용하여 html 페이지 내에서 curl 명령의 결과를 에 게시하려고합니다.yesod를 사용하여 HTML 페이지에 컬 결과를 어떻게 표시 할 수 있습니까?

{-# LANGUAGE TypeFamilies, QuasiQuotes, MultiParamTypeClasses, 
     TemplateHaskell, OverloadedStrings #-} 
import Yesod 
import Network.Curl 
import Text.Blaze hiding (toMarkup) 

data HelloWorld = HelloWorld 

mkYesod "HelloWorld" [parseRoutes| 
/HomeR GET 
|] 

url = "http://www.google.com/" 
opts = [CurlFollowLocation True] 

res=withCurlDo $ do 
      curlGet url opts 
      return() 

instance ToMarkup (IO a) where 
toMarkup a = a 

instance Yesod HelloWorld 

getHomeR :: Handler RepHtml 
getHomeR = defaultLayout [whamlet|#{toMarkup res}|] 

main :: IO() 
main = warpDebug 3000 HelloWorld 

이 코드는 경고

Warning: No explicit method nor default method for `Text.Blaze.toMarkup' 
In the instance declaration for `ToMarkup (IO a)' 

와 서버를 실행하고 "내부 제공

http://localhost:3000 

에 웹 브라우저를 가리키는 : 이 내가 지금까지 가지고있는 코드입니다 서버 오류 "HTML 페이지로 위의 경고 메시지와 함께.

저는 하스켈과 셉소에 상당히 익숙합니다. 누군가 도움을 줄 수 있습니까?

답변

1

toMarkup의 들여 쓰기가 잘못되었습니다 (들여 쓰기되어야합니다). 그러나 유형은 여전히 ​​잘못되었습니다. toMarkupMarkup 인스턴스를 반환하고 curlGet은 출력을 stdout으로 덤프하는 반면 캡처하고 다시 렌더링해야합니다. 이 같은

시도 뭔가 :

{-# LANGUAGE TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings #-} 
import Yesod 
import Network.Curl 

data HelloWorld = HelloWorld 

mkYesod "HelloWorld" [parseRoutes| 
    /HomeR GET 
    |] 

url = "http://www.google.com/" 
opts = [CurlFollowLocation True] 

instance Yesod HelloWorld 

getHomeR = do 
    (code, res) <- liftIO $ curlGetString url opts   
    -- This doesn't work since Yesod HTML-escapes the content in the template 
    -- defaultLayout [whamlet|#{res}|] 
    return $ RepHtml $ toContent res 

main :: IO() 
main = warpDebug 3000 HelloWorld 

대안으로 당신은 또한 http-conduit package을 사용할 수, 컬합니다. 수입품 Net.HTTP.Conduit 및 이라고 쓰십시오 :

getHomeR = fmap (RepHtml . toContent) . liftIO $ simpleHttp "http://www.google.com" 
+0

감사합니다 루크 ... 이것은 매우 도움이되었습니다! – sudoking