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.
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.
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
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.