使用Haskell编写一个Web服务器
发布时间:2023-12-10 01:44:32
以下是一个使用Haskell编写的简单Web服务器的示例代码:
import Network.HTTP.Types (status200)
import Network.Wai (responseLBS, responseBuilder, pathInfo, queryString, Middleware, Request, Response, Application, responseFile)
import Network.Wai.Handler.Warp (run)
-- 处理请求的函数
app :: Application
app request respond = respond $ case (pathInfo request) of
-- 默认根路径返回"Hello, World!"
[] -> responseLBS status200 [("Content-Type", "text/plain")] "Hello, World!"
-- /echo 路径返回查询字符串中的参数
["echo"] -> responseLBS status200 [("Content-Type", "text/plain")] $ queryString request
-- /static 路径返回静态文件
["static", file] -> responseFile status200 [("Content-Type", "text/html")] ("static/"++file) Nothing
-- 其他路径返回 404 错误
_ -> responseBuilder status404 [("Content-Type", "text/plain")] "404 - Not Found"
-- 日志中间件
loggerMiddleware :: Middleware
loggerMiddleware app request respond = do
putStrLn $ "Received request: " ++ show (pathInfo request)
app request respond
-- 主函数
main :: IO ()
main = do
putStrLn "Starting server on port 3000..."
run 3000 $ loggerMiddleware app
这是一个简单的 Web 服务器,使用了 wai 和 warp 库。服务器监听在本地的 3000 端口,并根据不同的路径返回相应的内容。
服务器包含了三个路径的处理逻辑:
1. 当路径为空时,返回 "Hello, World!"。
2. 当路径为 "/echo" 时,返回查询字符串中的参数。
3. 当路径为 "/static" 时,返回名为 file 的静态文件。
代码中还添加了一个日志中间件,用于记录接收到的请求的路径信息。这样,每次收到请求时,服务器将在控制台上打印请求的路径。
可以使用以下命令编译并运行代码:
$ ghc -threaded -o server server.hs $ ./server
然后可以在浏览器中访问 http://localhost:3000 来查看默认页面,http://localhost:3000/echo?param=value 来查看查询字符串的返回值,http://localhost:3000/static/index.html 来查看静态文件。
