Haskell Scotty 网络编程指南
函数式 Web 开发精要
前言
在现代软件开发中,函数式编程正在重新定义我们构建应用程序的方式。Haskell 作为纯函数式编程语言的代表,其强大的类型系统和数学优雅性为 Web 开发带来了新的可能性。Scotty 框架以其简洁的 API 和强大的功能,成为 Haskell Web 开发的理想选择。
本书将带你从零开始,掌握使用 Scotty 构建现代 Web 应用程序的全过程。无论你是从其他编程语言转向 Haskell,还是想要探索函数式 Web 开发的奥秘,这本书都将为你提供系统而实用的指导。
适合读者: 具备 Haskell 基础语法知识,了解 HTTP 协议,希望学习函数式 Web 开发的程序员。
第1章:基础入门
1.1 Scotty 框架特点
Scotty 是一个轻量级的 Haskell Web 框架,灵感来源于 Ruby 的 Sinatra。它具有以下特点:
- 简洁的 DSL:提供直观的路由定义语法
- 类型安全:利用 Haskell 的类型系统防止运行时错误
- 高性能:基于 WAI(Web Application Interface)构建
- 易于扩展:支持中间件和插件系统
haskell
-- 一个简单的 Scotty 应用示例
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
main :: IO ()
main = scotty 3000 $ do
get "/" $ text "Hello, Scotty!"
get "/hello/:name" $ do
name <- param "name"
text $ "Hello, " <> name <> "!"
1.2 环境配置
安装 Stack
Stack 是 Haskell 的现代构建工具,推荐使用它来管理项目依赖:
bash
# 在 Ubuntu/Debian 上安装
curl -sSL https://get.haskellstack.org/ | sh
# 在 macOS 上安装
brew install haskell-stack
# 在 Windows 上下载安装器
# https://docs.haskellstack.org/en/stable/install_and_upgrade/
创建新项目
使用 stack 创建 scotty 项目
bash
stack new hello-scotty
cd hello-scotty
生成的项目结构如下:
lua
hello-scotty/
├── app
│ └── Main.hs -- 应用入口点
├── CHANGELOG.md
├── LICENSE
├── package.yaml -- 项目配置
├── README.md
├── Setup.hs
├── src
│ ├── Lib.hs -- 主要库代码
├── stack.yaml -- Stack 配置
└── test
└── Spec.hs -- 测试文件
编辑 package.yaml 添加 scotty 依赖
package.yaml
yaml
dependencies:
- base >= 4.7 && < 5
- scotty
- aeson
- text
1.3 Hello World 项目
创建你的第一个 Scotty 应用:
app/Lib.hs
haskell
{-# LANGUAGE OverloadedStrings #-}
module Lib
( someFunc
) where
import Data.Aeson (object, (.=))
import Data.Text.Lazy (Text)
import Web.Scotty
someFunc :: IO ()
someFunc = do
putStrLn "Starting server on port 3000..."
scotty 3000 routes
routes :: ScottyM ()
routes = do
-- 基本路由
get "/" $ text "Welcome to Scotty!"
-- 带参数的路由
get "/greet/:name" $ do
name <- pathParam "name"
text $ "Hello, " <> name <> "!"
-- JSON 响应
get "/api/status" $ json $ object
[ "status" .= ("ok" :: Text)
, "service" .= ("hello-scotty" :: Text)
]
运行项目:
bash
stack build
stack exec hello-scotty-exe
运行成功输出如下:
bash
$ stack exec hello-scotty-exe
Starting server on port 3000...
Setting phasers to stun... (port 3000) (ctrl-c to quit)
打开另一个终端,用 curl 进行测试
bash
$ curl http://127.0.0.1:3000
Welcome to Scotty!
$ curl http://127.0.0.1:3000/greet/Lupino
Hello, Lupino!
$ curl http://127.0.0.1:3000/api/status
{"service":"hello-scotty","status":"ok"}