Síťové služby

Web je nejspíše nejoblíbenější a nejvyužívanější síťová služba. Proto se zaměříme v tomto cvičení na něj.

HTTP dotazy

Základem webu je HTTP protokol. Pro práci s HTTP máme v Haskellu k dispozici knihovnu Network.HTTP. Nejdůležitější je funkce simpleHTTP, která jako parametr požaduje datovou strukturu Request a vrací strukturu Response. HTTP požadavky a odpovědi se typicky sestávají z hlavičky a těla. Součástí dotazu je i adresa, kterou sestavíme pomocí funkcí z modulu Network.URI.

Příklady

Nahrání souboru pomocí webového nahrávače Uploader. Data se posílají metodou multipart/form-data, jejíž popis se nachází na webu W3 konsorcia.

import Data.Maybe
import Network.URI
import Network.HTTP
import System.IO
import System.Environment

eol :: String
eol = "\r\n"

boundary :: String
boundary = "AaB03x"

url :: String
url = "http://vyuka.haskell.cz/uploader/?do=upl"

-- Pomocí této funkce lze připojit případné další hodnoty ve formuláři.
-- input :: String -> String -> String
-- input name value = "--" ++ boundary ++ eol ++ "Content-Disposition: form-data; name=\"" ++ name ++ "\"" ++ eol ++ eol ++ value ++ eol

main :: IO ()
main = getArgs >>= mapM_ upload

upload :: String -> IO ()
upload filename = do
    file <- readFile filename
    let body = "--" ++ boundary ++ eol ++ "Content-Disposition: form-data; name=\"userfile\"; filename=\"" ++ filename ++ "\""
            ++ eol ++ "Content-Type: text/plain" ++ eol ++ eol ++ file ++ eol ++ "--" ++ boundary ++ "--"
    response <- simpleHTTP $ Request { rqURI     = fromJust $ parseURI url
                                     , rqMethod  = POST
                                     , rqHeaders = [ Header HdrUserAgent       "Haskell Uploader"
                                                   , Header HdrReferer         url
                                                   , Header HdrContentEncoding "UTF-8"
                                                   , Header HdrContentType     ("multipart/form-data; boundary=" ++ boundary)
                                                   , Header HdrContentLength   (show $ length body)
                                                   , Header HdrAccept          "text/plain"
                                                   ]
                                     , rqBody    = body
                                     }
    print response

Webové frameworky

Pro zrychlení a usnadnění vývoje webových aplikací je vhodné použít framework, což je knihovna poskytující často využívané funkce. Pro Haskell takových knihoven existuje několik (z těch novějších kupříkladu Snap nebo Yesod), přičemž my se podíváme na framework Happstack. Více o něm v sérii článků na serveru Zdroják.

← IB016