跳转到内容

Common Lisp/外部库/Hunchentoot

来自Wikibooks,开放世界中的开放书籍

Hunchentoot 是一个用 Common Lisp 编写的 Web 应用服务器。

快速开始

[编辑 | 编辑源代码]

使用ASDF安装

[编辑 | 编辑源代码]

在支持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

参考文献

[编辑 | 编辑源代码]
华夏公益教科书