2017-10-09 28 views
1

读取POST数据在狡诈的Web服务器,我似乎无法找到阅读POST数据的任何文件。它似乎与“请求”一起作为“body”发送到我的入口函数。它看起来像体被编码为bytevector,我可以将其解码为一个字符串:如何在诡计Web服务器

(use-modules (rnrs bytevectors)) 
(utf8->string body) 

所以从这里我可以继续分析该字符串,但似乎相当繁琐,而且容易出错。有没有办法将POST数据作为某种列表读取?

+0

确实POST数据是正文,但它使用一些在Guile中尚不受支持的RFC编码。 – amirouche

+0

你能做些什么来解决这,就是发送基于你的窗体上的JSON,而不是做一个原始HTTP POST ... – amirouche

+0

感谢您的答复,在信息我正在寻找多个备选方案的光,发现“阿坦尼斯”这是一个适用于Guile的GNU网络服务器框架,它看起来像支持POST并且更好地处理静态文件,这听起来更接近我的需求。所以我想我只是在考虑这一点。 – ison

回答

0

这里是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))) 
+0

这也被用来解码查询字符串。 – amirouche

+0

我在github上有一个项目,我尝试从guile stdlib中收集所有缺失的部分https://github.com/a-guile-mind/guile-web – amirouche