Common Lisp/外部库/Hunchentoot
外观
< Common Lisp | 外部库
Hunchentoot 是一个用 Common Lisp 编写的 Web 应用服务器。
在支持ASDF的系统上安装Hunchentoot。以下命令将安装Hunchentoot及其所有依赖项。
(require 'asdf-install)
(asdf-install:install 'hunchentoot)
(asdf:oos 'asdf:load-op :hunchentoot)
(defpackage :testserv
(:use :cl :hunchentoot)
(:export :start-server))
(in-package :testserv)
;; Add a simple prefix dispatcher to the *dispatch-table*
(setq *dispatch-table*
`(,(create-prefix-dispatcher "/hello-world" 'hello-page)))
;; Handler functions either return generated Web pages as strings,
;; or write to the output stream returned by write-headers
(defun hello-page ()
"<html><body>Hello World!</body></html>")
(defun start-server (&key (port 4242))
(start (make-instance 'easy-acceptor :port port)))
启动服务器
(testserv:start-server :port 4242)
生成的图像可在 https://127.0.0.1:4242/hello-world 访问。
此示例展示了如何使用Vecto[1]生成PNG图像,并使用Hunchentoot提供服务。
第一步:加载外部依赖项
(asdf:oos 'asdf:load-op :hunchentoot)
(asdf:oos 'asdf:load-op :vecto)
第二步:声明一个包
(defpackage :testserv
(:use :cl :vecto :hunchentoot)
(:export :start-server))
(in-package :testserv)
向*dispatch-table*
添加一个简单的前缀分发器
(setq *dispatch-table*
`(,(create-prefix-dispatcher "/img" 'img-page)))
img-page
函数期望HTTP参数height
包含一个整数值,并生成一个高度为height
像素的PNG图像。如果未指定参数,则使用默认值150。
(defun img-page ()
(setf (content-type*) "image/png")
(let ((out (send-headers)) ; send-headers returns the output flexi-stream
(bar-height (or (and (parameter "height") (parse-integer (parameter "height")))
150)))
(with-canvas (:width 10 :height bar-height)
(rectangle 0 0 10 bar-height)
(set-gradient-fill 0 0
0 1 1 1
0 bar-height
1 0 0 1)
(fill-and-stroke)
(save-png-stream out)))) ; write the image data to the output stream obtained from send-headers
启动服务器
(testserv:start-server :port 4242)
生成的图像可在 https://127.0.0.1:4242/img 访问。尝试更改高度: https://127.0.0.1:4242/img?height=350
- http://weitz.de/hunchentoot/ — Hunchentoot 主页
- http://www.cliki.net/hunchentoot — Common Lisp Wiki 中的 Hunchentoot 条目
- LispCast:用 Common Lisp 编写简单的 Reddit 克隆