2017-10-09 1 views
1

Dans le serveur Web de Guile, je n'arrive pas à trouver de documentation sur la lecture des données POST. Il semble être envoyé à ma fonction entrypoint comme "corps" avec la "demande". On dirait que le corps est codé comme bytevector et je peux décoder dans une chaîne:Comment lire les données POST dans le serveur Web Guile

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

donc d'ici je pourrais continuer d'analyser la chaîne, mais qui semble assez fastidieux et source d'erreurs. Est-il impossible de lire les données POST sous forme de liste?

+0

En effet, les données POST sont le corps mais elles sont codées en utilisant certains RFC qui ne sont pas encore supportés dans Guile. – amirouche

+0

Ce que vous pouvez faire pour contourner cela, est d'envoyer un json basé sur votre formulaire au lieu de faire un HTTP POST brut ... – amirouche

+0

Merci pour les réponses, à la lumière de cette information je cherchais des alternatives et trouvé "Artanis" qui est un framework de serveur web GNU pour Guile et il semble qu'il supporte POST et aussi une meilleure gestion des fichiers statiques, ce qui ressemble beaucoup plus à mes besoins. Donc je pense que je vais juste regarder ça. – ison

Répondre

0

Voici le code de decode procédure qui va convertir un BODY en une liste d'association de listes où la clé est le nom du champ de formulaire et la valeur est une liste de valeurs associées à cette clé. Remarquez que la "valeur" associée à une clé donnée dans l'assoc renvoyée par decode est toujours une liste.

(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

Ceci est également utilisé pour décoder la chaîne de requête. – amirouche

+0

J'ai un projet sur github où j'essaie de rassembler toutes les pièces manquantes de guile stdlib https://github.com/a-guile-mind/guile-web – amirouche