Как читать данные POST на веб-сервере Guile

На веб-сервере Guile я не могу найти никакой документации по чтению данных POST. Кажется, он отправляется в мою функцию точки входа как «тело» вместе с «запросом». Похоже, что тело закодировано как байт-вектор, и я могу декодировать его в строку:

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

Итак, отсюда я мог бы приступить к разбору строки, но это кажется довольно утомительным и подверженным ошибкам. Нет ли способа прочитать данные POST в виде какого-то списка?


person ison    schedule 09.10.2017    source источник
comment
Действительно, данные POST являются телом, но они закодированы с использованием некоторого RFC, который еще не поддерживается в Guile.   -  person amirouche    schedule 10.10.2017
comment
Что вы можете сделать, чтобы обойти это, это отправить json на основе вашей формы вместо того, чтобы выполнять необработанный HTTP POST...   -  person amirouche    schedule 13.10.2017
comment
Спасибо за ответы, в свете этой информации я искал альтернативы и нашел Artanis, который представляет собой фреймворк веб-сервера GNU для Guile, и похоже, что он поддерживает POST, а также лучшую обработку статических файлов, что звучит намного ближе к моим потребностям. Так что я думаю, что я просто буду изучать это.   -  person ison    schedule 13.10.2017
comment
Я не нахожу, как поддерживать POST-формы в artanis? Можете ли вы опубликовать ответ на свой вопрос, чтобы я мог проголосовать за него? TX!   -  person amirouche    schedule 03.11.2017
comment
Извините, что я на самом деле не смог заставить его работать в Артанисе в конце концов. Но здесь есть несколько примеров того, как это должно работать: gnu.org/ software/artanis/manual/manual.html Я все еще с нетерпением жду возможности сделать это с хитростью в будущем, но я предполагаю, что сначала нужно немного больше доработать (или, может быть, это уже работает в artanis, но я просто не правильно сделал)   -  person ison    schedule 04.11.2017
comment
На самом деле я знаю, как это сделать. Извините, я забыл об этом...   -  person amirouche    schedule 11.11.2017


Ответы (1)


Вот код процедуры decode, которая преобразует BODY в ассоциативный список списков, где ключом является имя поля формы, а значением является список значений, связанных с этим ключом. Имейте в виду тот факт, что «значение», связанное с данным ключом в assoc, возвращаемом 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)))
person amirouche    schedule 11.11.2017
comment
У меня есть проект на github, где я пытаюсь собрать все недостающие элементы из guile stdlib github. com/a-guile-mind/guile-web - person amirouche; 11.11.2017