2016-08-24 4 views
0

Ich versuche HTML auf eine Seite zu schreiben, wenn ein bestimmter Weg getroffen wird:Wie schreibe ich HTML in ein Handle?

import Control.Monad 
import Data.Char 
import System.IO 
import Network 
import Data.Time.LocalTime 

data RequestType = GET | POST deriving (Show) 
data Request = Request { rtype :: RequestType, path :: String, options :: [(String,String)] } 
data Response = Response { version :: String, statuscode :: Int } 

instance Show Response where 
    show r = version(r) ++ " " ++ show(statuscode(r)) ++ " " ++ (case statuscode(r) of 
     100 -> "Continue" 
     200 -> "OK" 
     404 -> "Not Found") ++ "\r\n\r\n" 

-- respond function 
respond :: Request -> Handle -> IO() 
respond request handle = do 
    putStrLn $ show request 
    let response = Response {version = "HTTP/1.1", statuscode = 200} 
    hPutStr handle $ show(response) 
    hPutStr handle $ "Haskell says " ++ (getMessage request) 
    where getMessage r 
      | (path r) == "/hello" = "<b>hello there!</b>" <-- HERE 
      | otherwise = (path r) 

ich ohne Fehler diesen Code ausführen kann, aber wenn ich http getroffen: // {Hostname}/hallo ich die String <b>hello there!</b> bedeutet, dass der HTML-Code als String gerendert wird.

Wie rende ich es als HTML?

HINWEIS

ich dies mit Vanille Haskell tun wollen, keine Bibliotheken 3. Partei bedeutet.

+0

Welches Web-Framework/welche Bibliothek verwenden Sie? – ErikR

+0

Bitte lesen Sie den Hinweis, no framework – dopatraman

+0

Geben Sie einen 'Content-type:' header aus? Was wird 'hPutStr handle $ show (response)' tatsächlich ausdrucken? – ErikR

Antwort

0

Sie geben keinen Content-Type-Header aus. Ohne einen Content-Type Header Browser wird wahrscheinlich die Ausgabe als Nur-Text - nicht HTML.

Wenn Sie Ihren Code ändern zu emittieren:

HTTP/1.1 200 OK 
Content-type: text/html; charset=UTF-8 

Haskell says: <b>hello there!</b> 

es als HTML in Ihrem Browser gerendert werden soll.

Diese SO Antwort hat ein Beispiel für eine einfache HTTP-Antwort enthält HTML:

https://stackoverflow.com/a/26346025/866915

aktualisieren

Basierend auf Ihren Code, sollte diese Arbeit:

response :: Request -> Handle -> IO() 
response _ h = do 
    hPutStr h "HTTP/1.1 200 OK\r\n" 
    hPutStr h "Content-type: text/html; charset=UTF-8\r\n" 
    hPutStr h "\r\n\r\n" 
    hPutStr h "Haskell says: <b>hello there!</b>\n" 

Dies setzt voraus, dass Sie den Handle nach dem Auslösen der Antwort aufschließenzeigen das Ende der Antwort an. Beachten Sie auch, dass Ihre Show-Instanz für die Antwort nicht sehr hilfreich ist, da Sie nach der HTTP-Zeile, aber vor der Leerzeile, weitere Header hinzufügen müssen.

Wenn Sie einen Link zu Ihrem Server-Code veröffentlichen, kann ich dies für Sie testen.

+0

können Sie ein funktionierendes Beispiel veröffentlichen? – dopatraman

+0

Antwort aktualisiert - Wenn Sie einen Link zu Ihrem Server-Code veröffentlichen, werde ich das testen - sonst kann ich nur Annahmen darüber machen, wie die Antwortfunktion funktionieren soll. – ErikR

+0

hat einen Link: https://gist.github.com/doptraman/1573a20f53bf7c5a5d8b25cac9c9d82b – dopatraman

Verwandte Themen