рд╣реИрдкрд╕реНрдЯреИрдХ рд▓рд╛рдЗрдЯ: рд╣рд╛рд╕реНрдХреЗрд▓ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ

рдЫрд╡рд┐
рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░, рдХреНрд▓реЙрдХрд░реНрд╕ рдПрдХ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдЬреЛ рд╣реИрдкрд╕реНрдЯреИрдХ рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рд╣реИрдкрд╕реНрдЯреИрдХ рдПрдХ рд╕рдореГрджреНрдз рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рд╛рдирджрд╛рд░ рдлреАрдЪрд░ рд╡рд╛рд▓рд╛ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдЬреЛ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рд╕рд╛рдд рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рдЕрдореАрд░ рдФрд░ рд▓рдЪреАрд▓рд╛ рдПрдкреАрдЖрдИ рдмреЗрдХрд╛рд░ рдФрд░ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд░рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмрд╣реБрддреЛрдВ рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣реИрдкрд╕реНрдЯреИрдХ рдХреЗ рд╡рд┐рдВрдЧ рдХреЗ рддрд╣рдд рд╣реИрдкреНрдкреАрд╕реНрдЯреИрдХ рд▓рд╛рдЗрдЯ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдмрд╣реБрдд рд╣реА рд╕реБрдВрджрд░ рдФрд░ рдЖрд╕рд╛рди рдЙрдкрдпреЛрдЧ рд╣реИред


рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рд╣реИрдкрд╕реНрдЯреИрдХ рд▓рд╛рдЗрдЯ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╣реИрдкрд╕реНрдЯреИрдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕:
  1. рд╣рдордиреЗ рд╕рднреА рдореВрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдПрдХ рдПрдХрд▓ Happstack.Lite рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред
  2. рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджрд┐рдП, рдореЛрдирдб рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ред
  3. рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 2,000 рд╕реЗ рднреА рдХрдо рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд - рд╣реИрдкрд╕реНрдЯреИрдХ рд▓рд╛рдЗрдЯ рд╣реИрдкрд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИ! рдпрджрд┐ рдЖрдк рд╣реИрдкрд╕реНрдЯреИрдХ рд▓рд╛рдЗрдЯ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рд╣реИрдкрд╕реНрдЯреИрдХ рд╕реЗ рдПрдХ рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣реИрдкрд╕реНрдЯреИрдХ рд▓рд╛рдЗрдЯ рд╕реЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ 4 рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:
  1. import Happstack.Lite рд╕рд╛рде рдмрджрд▓реЗрдВ
  2. serve Nothing simpleHTTP nullConf рд╕рд╛рде рдмрджрд▓реЗрдВ
  3. import Control.Monad (msum) рдЬреЛрдбрд╝реЗрдВред import Control.Monad (msum)
  4. рд╕реНрдкрд╖реНрдЯ decodeBody рдЬреЛрдбрд╝реЗрдВ ( рд╡рд┐рд╡рд░рдг )


рдЬрдмрдХрд┐ рд╣реИрдкреНрдкрд╕реНрдЯреИрдХ рд▓рд╛рдЗрдЯ рдирд┐рдпрдорд┐рдд рд╣реИрдкрд╕реИрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рд▓реНрдХрд╛ рд╣реИ, рдпрд╣ рдЕрднреА рднреА рдЕрдиреНрдп рд╣рд╛рд╕реНрдХреЗрд▓ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдврд╛рдВрдЪрд╛ рд╣реИред

рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХреБрдЫ рдЙрдиреНрдирдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬреЛ рд╣реИрдкрд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд URL, рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝реЙрд░реНрдо, HTML рд╢рд╛рдмреНрджрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣реИрдкреНрдкрд╕реНрдЯреИрдХ рдлрд╝рд╛рдЙрдВрдбреЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реАрдЦрдиреЗ рдХреА рдЕрд╡рд╕реНрдерд╛ рдЕрдзрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЪреВрдВрдХрд┐ рдпреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИрдкреНрдкрд╕реНрдЯреИрдХ рдХреЛрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдирд┐рд░реНрдорд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЕрдзреНрдпрдпрди рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдЙрдирдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИред

рдЧрд╣рд░реА рдирдЬрд╝рд░ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╣реИрдкрд╕реНрдЯреИрдХ рдХреНрд░реИрд╢ рдХреЛрд░реНрд╕ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ( рдпрджрд┐ рдореИрдВ рдЗрд╕рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реБрдБ рддреЛ рдЗрд╕ рдкрд░ рд░реБрдЪрд┐ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рдПрдЧреА - рд▓рдЧрднрдЧ рдкреНрд░рддрд┐ ) ред

рд╕рд░реНрд╡рд░ рд╢реБрд░реВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рднрд╛рд╖рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдЪрд╛рд╣рд┐рдП:
 {-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} 

рдЕрдм рд╣рдо рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
 module Main where import Control.Applicative ((<$>), optional) import Data.Maybe (fromMaybe) import Data.Text (Text) import Data.Text.Lazy (unpack) import Happstack.Lite import Text.Blaze.Html5 (Html, (!), a, form, input, p, toHtml, label) import Text.Blaze.Html5.Attributes (action, enctype, href, name, size, type_, value) import qualified Text.Blaze.Html5 as H import qualified Text.Blaze.Html5.Attributes as A 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо serve рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рддрд░реНрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ, рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╣рдорд╛рд░рд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реА рд╣реИред
 main :: IO () main = serve Nothing myApp 

рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯрд╛рдЗрдк ServerPart Response ред рдЖрдк ServerPart IO ServerPart рд╡реЗрдм рд╕рдордХрдХреНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

( рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреЛрд░реНрдЯ 8000 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рдЖрдк рдЕрдкрдирд╛ рдЖрд╡реЗрджрди http: // localhost: 8000 / - рд▓рдЧрднрдЧ рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдереИрддрд┐рдХ рдкрддреЗ


рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ:
 myApp :: ServerPart Response myApp = msum [ dir "echo" $ echo , dir "query" $ queryParams , dir "form" $ formPage , dir "fortune" $ fortune , dir "files" $ fileServing , dir "upload" $ upload , homePage ] 

рдЗрд╕рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреБрдЫ рд╣реА рд╣реИрдВрдбрд▓рд░ рд╣реИрдВ рдЬреЛ рд╕реНрдереИрддрд┐рдХ рдкрддреЗ рдкрд░ рдореИрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

dir рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣реИрдВрдбрд▓рд░ рддрднреА рдЪрд▓реЗ рдЬрдм рд╕реНрдереИрддрд┐рдХ рдкрде рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, dir "echo" рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрддреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ localhost:8000/echo localhost:8000/echo ред рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ "/foo/bar" рдХреЗ рдкрддреЗ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ dir "foo" $ dir "bar" $ handler рд▓рд┐рдЦреЗрдВред

рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рднреА рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Response ред

рд╣рдо msum рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреА рд╕реВрдЪреА рдХреЛ рдПрдХрд▓ рдореЗрдВ msum ред

рдЕрдВрддрд┐рдо рд╣реИрдВрдбрд▓рд░ - homePage - рдХрд┐рд╕реА рднреА рдЪреАрдЬ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ ( рдпрд╣ рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ - рд▓рдЧрднрдЧред ), рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рднреА рдЕрдиреНрдп рд╣реИрдВрдбрд▓рд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

HTML рдЯреЗрдореНрдкрд▓реЗрдЯ


рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ HTML рдкреЗрдЬ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗред рд╣рдо рдмреНрд▓реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рднреА рд╣реИред

HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рдХрд╛ рд╡рд┐рд╖рдп рд╕рдореБрджрд╛рдп рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╡рд╛рдж рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреЛрдИ рднреА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рд┐рд╕реНрдЯрдо рд╕рднреА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣реИрдкрд╕реНрдЯреИрдХ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдмреНрд▓реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╣реИ рдФрд░ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рд╕рдВрдХрд▓рди-рдЯрд╛рдЗрдо рдкреИрдЯрд░реНрди рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди HTML рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк HSP рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВ рдФрд░ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣реАрд╕реНрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реАрдПрд╕рдПрд╕, рдмрд╛рд╣рд░реА рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓реЗрдВ, рдореЗрдиреВ рдЖрджрд┐ рдЖрдпрд╛рдд рдХрд░рдирд╛ред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 template :: Text -> Html -> Response template title body = toResponse $ H.html $ do H.head $ do H.title (toHtml title) H.body $ do body p $ a ! href "/" $ " " 


рддрдм рдореБрдЦреНрдп рдкреГрд╖реНрда рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 homePage :: ServerPart Response homePage = ok $ template " " $ do H.h1 "!" Hp "   Happstack Lite   !" Hp "   :" Hp $ a ! href "/echo/secret%20message" $ "" Hp $ a ! href "/query?foo=bar" $ " " Hp $ a ! href "/form" $ " " Hp $ a ! href "/fortune" $ "- ()" Hp $ a ! href "/files" $ "  " Hp $ a ! href "/upload" $ " " 

рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП ok рдлрд╝рдВрдХреНрд╢рди HTTP рдХреЛрдб "200 OK" рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рднреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, notFound рдХреЛрдб рдХреЛ "404 Not Found" рдкрд░ seeOther , seeOther рдХреЛ "303 рдЕрдиреНрдп рджреЗрдЦреЗрдВ" рдХреЗ рд▓рд┐рдП seeOther рд╣реИред HTTP рдХреЛрдб рдХреЛ рдПрдХ рдирдВрдмрд░ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setResponseCode рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрддреЗ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд╣рд┐рд╕реНрд╕реЗ


dir рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдкрддреЗ рдХреЗ рд╕реНрдерд┐рд░ рднрд╛рдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╣рдо рдПрдбреНрд░реЗрд╕ рдХреЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рд╡реИрд▓реНрдпреВ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП path рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ Integer рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдмрд╕ рдкрде рдХреЗ рдЧрддрд┐рд╢реАрд▓ рднрд╛рдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╛рддреНрд░рд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП http: // localhost: 8000 / рдЧреВрдВрдЬ / рд╢рд╛рдирджрд╛рд░
 echo :: ServerPart Response echo = path $ \(msg :: String) -> ok $ template "" $ do p $ "  : " >> toHtml msg p "  ,     - ." 


рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░


рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рди рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрд╕ рдкрддреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ " ?foo=bar " рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред Http: // localhost: 8000 / query; Foo = bar рдкрд░ рдЬрд╛рдХрд░ рджреЗрдЦреЗрдВ
 queryParams :: ServerPart Response queryParams = do mFoo <- optional $ lookText "foo" ok $ template " " $ do p $ "foo = " >> toHtml (show mFoo) p $ "  ,     foo." 

рдпрджрд┐ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ lookText рдлрд╝рдВрдХреНрд╢рди mzero ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо Control.Applicative рдореЙрдбреНрдпреВрд▓ рд╕реЗ optional рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдорд┐рд▓ рд╕рдХреЗред

рдЖрдХрд╛рд░


рд╣рдо рд░реВрдкреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП lookText рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 formPage :: ServerPart Response formPage = msum [ viewForm, processForm ] where viewForm :: ServerPart Response viewForm = do method GET ok $ template "form" $ form ! action "/form" ! enctype "multipart/form-data" ! A.method "POST" $ do label ! A.for "msg" $ " - " input ! type_ "text" ! A.id "msg" ! name "msg" input ! type_ "submit" ! value "" processForm :: ServerPart Response processForm = do method POST msg <- lookText "msg" ok $ template "form" $ do Hp " :" Hp (toHtml msg) 

рд╣рдо рдлреЙрд░реНрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЙрд╕реА lookText рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо GET рдФрд░ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП method рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдкрддреНрд░ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ GET рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ /form рдкреЗрдЬ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред HTML form рдЯреИрдЧ рдореЗрдВ, рдПрдХ рдмрдЯрди рдХреЗ рдХреНрд▓рд┐рдХ рдкрд░ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдордиреЗ рдЙрд╕реА рдкреГрд╖реНрда рдХреЛ рдЦреЛрд▓рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдордиреЗ POST рд╡рд┐рдзрд┐ рдХреЛ рдЪреБрдирд╛ред

рдХреБрдХреАрдЬрд╝! (HTTP рдХреБрдХреАрдЬрд╝)


рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреБрдХреАрдЬрд╝ рдореЗрдВ рд╕рдВрджреЗрд╢ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рдкреНрд░рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╡рд╣ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛, рддреЛ рдкреГрд╖реНрда рд╕рд╣реЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдЧрд╛ред
 fortune :: ServerPart Response fortune = msum [ viewFortune, updateFortune ] where viewFortune :: ServerPart Response viewFortune = do method GET mMemory <- optional $ lookCookieValue "- ()" let memory = fromMaybe "      -!" mMemory ok $ template "fortune" $ do Hp "   - ():" Hp (toHtml memory) form ! action "/fortune" ! enctype "multipart/form-data" ! A.method "POST" $ do label ! A.for "fortune" $ "  : " input ! type_ "text" ! A.id "fortune" ! name "new_fortune" input ! type_ "submit" ! value "" updateFortune :: ServerPart Response updateFortune = do method POST fortune <- lookText "new_fortune" addCookies [(Session, mkCookie "fortune" (unpack fortune))] seeOther ("/fortune" :: String) (toResponse ()) 
( рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ HTTP- рдХреБрдХреА рдФрд░ рднрд╛рдЧреНрдп рдХреБрдХреА - рд▓рдЧрднрдЧ рдкреНрд░рддрд┐ рдХреЗ рдмреАрдЪ рдХреА рд╕рдЬрд╛ рдХреЛ рдирд╣реАрдВ рдмрдЪрд╛ рд╕рдХрд╛ред )

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдереЛрдбрд╝рд╛ рдирдпрд╛ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ:
  1. lookCookieValue рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдореВрд▓реНрдп рдЦреЛрдЬрддрд╛ рд╣реИ, рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдлрд╝реЙрд░реНрдо рдирд╣реАрдВред
  2. addCookies рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХреБрдХреАрдЬрд╝ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ: addCookies :: [(CookieLife, Cookie)] -> ServerPart ()
  3. CookieLife рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдм рддрдХ рдХреБрдХреАрдЬрд╝ рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рд╕рд╣реА рдорд╛рдиреА рдЬрд╛рддреА рд╣реИрдВред рдЬрдм рддрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдмрдВрдж рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА рддрдм рддрдХ Session рдЕрд░реНрде рдХреБрдХреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рдирдХрд╛рд▓ рд╣реИред
  4. mkCookie рдХреБрдХреА рдХреЗ рдирд╛рдо, рдЙрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ Cookie рдмрдирд╛рддрд╛ рд╣реИред
  5. seeOther (рдпрд╛рдиреА, 303 рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ) рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ /fortune рдкреГрд╖реНрда рдкрд░ рдПрдХ рдирдпрд╛ GET рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред


рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ


рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЪрд┐рддреНрд░, рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЖрджрд┐ред рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 fileServing :: ServerPart Response fileServing = serveDirectory EnableBrowsing ["index.html"] "." 

рдкрд╣рд▓рд╛ рддрд░реНрдХ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ serveDirectory рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рддреИрдпрд╛рд░ serveDirectory рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗред
рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреАрд╕рд░рд╛ рддрд░реНрдХ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдорд╛рд░реНрдЧ рд╣реИ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рд╕рдорд░реНрдерд┐рдд рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ (рд▓рд┐рдирдХреНрд╕, рдУрдПрд╕ рдПрдХреНрд╕, рд╡рд┐рдВрдбреЛрдЬ) рдкрд░, serveDirectory рдлрд╝рдВрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ serveDirectory sendfile() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред sendfile() рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдиреНрдпреВрдирддрдо CPU рд▓реЛрдб рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЪреИрдирд▓ рдХреЗ рдЕрдзрд┐рдХрддрдо рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХрд░реНрдиреЗрд▓ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рди


рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╣рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди lookText рдмрдЬрд╛рдп lookText рдЙрдкрдпреЛрдЧ lookFile ред
 upload :: ServerPart Response upload = msum [ uploadForm , handleUpload ] where uploadForm :: ServerPart Response uploadForm = do method GET ok $ template " " $ do form ! enctype "multipart/form-data" ! A.method "POST" ! action "/upload" $ do input ! type_ "file" ! name "file_upload" ! size "40" input ! type_ "submit" ! value "upload" handleUpload :: ServerPart Response handleUpload = do (tmpFile, uploadName, contentType) <- lookFile "file_upload" ok $ template " " $ do p (toHtml $ " : " ++ tmpFile) p (toHtml $ " : " ++ uploadName) p (toHtml $ " : " ++ show contentType) 


рдЬрдм рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╕рд░реНрд╡рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИ рддреЛ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдЧреАред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдкреНрд░рдпреБрдХреНрдд рдлрд╛рдЗрд▓реЗрдВ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рди рдХрд░реЗрдВред

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдПрдХ moveFile рдпрд╛ copyFile рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдлрд╛рдЗрд▓ рдХреЛ рдЙрд╕рдХреЗ рд╕реНрдерд╛рдпреА рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ (рдпрд╛ рдХреЙрдкреА) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ


рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдорд╛рдирддреЗ рд╣реИрдВред рд╣реИрдкрд╕реНрдЯреИрдХ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрдЯ рдкрд░ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдк рдЗрд╕ рдврд╛рдВрдЪреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг (рдПрдХ рдХреЛрд░реНрд╕ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рднреА рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ) рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдКрдВрдЧрд╛ ред рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ!

Source: https://habr.com/ru/post/In185524/


All Articles