0

不必在这里问这个问题,但是由于文档不好,我如何在 Spiffy (egg) 应用程序中访问查询字符串?谢谢!

(use intarweb spiffy sxml-serializer) 

(tcp-buffer-size 2048)
(server-port 80)

(handle-not-found (lambda (path)    
    ; (print (request-uri (current-request)))
    ; (print (request-method (current-request)))
    ; (print (current-pathinfo (current-request)))
    ; (print (current-file))
    ; (print (remote-address))
    (send-response 
        body: (serialize-sxml
            `(div (@ (class "page"))
                (h1 ,path))
            method: 'html))))

(start-server)
4

1 回答 1

0

我不确定您为什么要访问查询字符串,但 Spiffy 中的 URI 对象来自请求对象,正如您已正确识别的那样。请求对象来自 intarweb,它在request-uri属性中粘贴了一个 uri-common 对象。

您可以使用 uri-common 的访问器访问组成部分,如URI-common egg 参考中所述

为方便起见,查询字符串被解析为 alist,并可通过(uri-query (request-uri (current-request))).

“原始”查询字符串的访问方式稍有不同:uri-common egg 是低级 egg uri-generic 的便捷包装,您可以像以前一样通过调用 来访问它(uri->uri-generic URI),其中 URI 是(request-uri (current-request))

uri-query然后,您可以通过该egg 的过程访问查询字符串。这是一个可以在 REPL 上使用的简单示例:

#;1> (use uri-common (prefix uri-generic generic:))
#;2> (uri-reference "http://foo?x=y")
#<URI-common: scheme=http port=#f host="foo" path=() query=((x . "y")) fragment=#f>
#;3> (uri-query #2)
((x . "y"))
#;4> (uri->uri-generic #2)
#<<URI>>
#;5> (generic:uri-query #4)
"x=y"

我在这里所做的是将uri-generic 中的所有程序加上“generic:”前缀。这是必要的,因为 uri-common “遮蔽”了 uri-generic 定义的所有过程。

于 2014-08-15T09:11:54.157 回答