Scheme web编程 3. Get 和Post

By guenchi at 2017-11-27 • 0人收藏 • 292人看过

构造辅助过程split

(define split
    (lambda (s c)
        (let loop ((s s))
            (define str-index
                (lambda (s c)
                    (let ((n (string-length s)))
                        (let loop ((i 0))
                            (cond 
                                ((>= i n) #f)
                                    ((char=? (string-ref s i) c) i)
                                    (else (loop (+ i 1))))))))
            (if (string=? s "")
                '()
                (let ((i (str-index s c)))
                    (if i
                        (cons (substring s 0 i) (loop (substring s (+ i 1) (string-length s))))
                        (list s)))))))


于是构建过程,将 A=B&C=D结构的字符串切割为键值对放入上一章构建的链表。

(define tolist
    (lambda (x)
        (let loop ((x (split x #\&)))
            (define f 
                (lambda (x)
                    (let ((x (split (car x) #\=)))
                        (cons (car x) (cadr x)))))
            (if (null? (cdr x))
                (cons (f x) '())
                (cons (f x) (loop (cdr x)))))))


GET


Get发送的字符串可以通过(getenv "QUERY_STRING")得到

(define x (tolist (getenv "QUERY_STRING")))

假设发送的字符串为user=xxx&password=yyy

那么(index x "user")即可得到用户名

那么(index x "password")即可得到用户名


POST


Post方法会把输入流push到标准输入端口,所以我们直接从标准输入端口读入数据就可以了。

需要注意的是(read-line)过程已经失效了。所以我们用(read-char)按个读入字符。使用eof-object?来判断输入流是否关闭。

(define readpost
    (lambda ()
        (list->string
            (let loop((x (read-char)))
                (if (eof-object? x)
                    '()
                    (cons x (loop (read-char))))))))

使用CGI方式的POST数据会以AA=BB&CC=DD的格式传递,所以只需要用之前的过程将其分割即可。

(display (tojson (tolist (readpost))))

以上的代码会将接受到的数据以 {"AA":"BB","CC":"DD"} 返回客户端

或者使用以下的方式来取得特定键AA的值BB。

(index (tolist (readpost)) "AA")


至此我们掌握了如何简化HTML,解析JSON字符串,使用Get和Post于客户端交换数据。我们完全可以在此基础上建立一个简单的网站了。我们可以使用老派风格,完全用Scheme拼装HTML字符串,使用带Get尾部的超链接进行页跳转。也可以赶潮流的直接用Apache或Nginx将React制作的单页应用发到客户端,使用Post的JSON与其交换数据。


theschemer.org scheme中文社区原创 许可:你可以免费获得,储存或传播本文电子版本,唯一的条件是注明作者及本页链接。

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...