Доступ к строке запроса в приложении Spiffy
Здесь не нужно спрашивать об этом, но благодаря плохой документации, как мне получить доступ к строке запроса в приложении 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)
1 ответ
Я не совсем уверен, почему вы хотите получить доступ к строке запроса, но объекты URI в Spiffy происходят из объекта запроса, как вы правильно определили. Объект запроса от intarweb, который вставляет общий URI-объект в request-uri
приписывать.
Вы можете получить доступ к составным компонентам, используя аксессоры uri-common, как описано в справочнике по URI-common egg
Строка запроса разбирается в список для вашего удобства и доступна через (uri-query (request-uri (current-request)))
,
К "исходной" строке запроса можно получить доступ немного по-другому: универсальное яйцо uri - это удобная оболочка для более низкого уровня универсального яйца, доступ к которому можно получить, вызвав (uri->uri-generic URI)
где URI (request-uri (current-request))
, как прежде.
Затем вы можете получить доступ к строке запроса через uri-query
процедура из этого яйца Вот простой пример, который вы можете использовать в 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.