讀取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