读取POST数据在狡诈的Web服务器,我似乎无法找到阅读POST数据的任何文件。它似乎与“请求”一起作为“body”发送到我的入口函数。它看起来像体被编码为bytevector,我可以将其解码为一个字符串:如何在诡计Web服务器
(use-modules (rnrs bytevectors))
(utf8->string body)
所以从这里我可以继续分析该字符串,但似乎相当繁琐,而且容易出错。有没有办法将POST数据作为某种列表读取?
读取POST数据在狡诈的Web服务器,我似乎无法找到阅读POST数据的任何文件。它似乎与“请求”一起作为“body”发送到我的入口函数。它看起来像体被编码为bytevector,我可以将其解码为一个字符串:如何在诡计Web服务器
(use-modules (rnrs bytevectors))
(utf8->string body)
所以从这里我可以继续分析该字符串,但似乎相当繁琐,而且容易出错。有没有办法将POST数据作为某种列表读取?
这里是decode
过程的代码,这将一个BODY
转换成列表的关联列表,其中键是表单字段的名称和值与该键相关联的值的列表。请注意,由decode
返回的关联关联中的“值”始终是一个列表。
(define-module (web decode))
(use-modules (ice-9 match))
(use-modules (rnrs bytevectors))
(use-modules (srfi srfi-1))
(use-modules (srfi srfi-26))
(use-modules (web uri))
;;;
;;; decode
;;;
(define (acons-list k v alist)
"Add V to K to alist as list"
(let ((value (assoc-ref alist k)))
(if value
(let ((alist (alist-delete k alist)))
(acons k (cons v value) alist))
(acons k (list v) alist))))
(define (list->alist lst)
"Build a alist of list based on a list of key and values.
Multiple values can be associated with the same key"
(let next ((lst lst)
(out '()))
(if (null? lst)
out
(next (cdr lst) (acons-list (caar lst) (cdar lst) out)))))
(define-public (decode bv)
"Convert BV querystring or form data to an alist"
(define string (utf8->string bv))
(define pairs (map (cut string-split <> #\=)
;; semi-colon and amp can be used as pair separator
(append-map (cut string-split <> #\;)
(string-split string #\&))))
(list->alist (map (match-lambda
((key value)
(cons (uri-decode key) (uri-decode value)))) pairs)))
确实POST数据是正文,但它使用一些在Guile中尚不受支持的RFC编码。 – amirouche
你能做些什么来解决这,就是发送基于你的窗体上的JSON,而不是做一个原始HTTP POST ... – amirouche
感谢您的答复,在信息我正在寻找多个备选方案的光,发现“阿坦尼斯”这是一个适用于Guile的GNU网络服务器框架,它看起来像支持POST并且更好地处理静态文件,这听起来更接近我的需求。所以我想我只是在考虑这一点。 – ison