2017-10-09 25 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