欢迎访问宙启技术站
智能推送

使用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 服务器,使用了 waiwarp 库。服务器监听在本地的 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 来查看静态文件。