29.7 Reading URL encoded request body (x-www-form-urlencoded)

Here a simple implementation of reading a form encoded body (bytevector) into an alist:

(define-module (my module)
  #:use-module (ice-9 textual-ports)
  #:use-module (ice-9 time)
  #:use-module (ice-9 format)
  #:use-module (ice-9 string-fun)
  #:use-module (ice-9 iconv)
  #:export (read-url-encoded-body))

(define (at-eq x)
  (string-split x #\=))
(define (unsafe-mk-alist x)
  (cons (car x)
        (cdr x)))
(define (read-url-encoded-body body)
  (let* ((str (bytevector->string body "utf-8"))
         (raw-kv-pairs (string-split str #\&))
         (xss (map unsafe-mk-alist
                   (map at-eq raw-kv-pairs))))
    xss))

Then in your controller you can use it as:

(let* ((body (rc-body rc))
       (kv (read-url-encoded-body body)))
  (display (format #f "parsed body alist: ~s" kv))