Racket URL调度

Ina*_*thi 7 scheme webserver url-routing racket

我正在尝试使用Racket(以前的PLT Scheme)连接URL调度.我看了一下教程和服务器文档.我无法弄清楚如何将请求路由到相同的servlet.

具体例子:

#lang scheme

(require web-server/servlet)
(require web-server/dispatch)
(provide/contract (start (request? . -> . response/c)))

(define (start request)
  (blog-dispatch request))

(define-values (blog-dispatch blog-url)
  (dispatch-rules
   (("") list-posts)
   (("posts" (string-arg)) review-post)
   (("archive" (integer-arg) (integer-arg)) review-archive)
   (else list-posts)))

(define (list-posts req) `(list-posts))
(define (review-post req p) `(review-post ,p))
(define (review-archive req y m) `(review-archive ,y ,m))

(require web-server/servlet-env)
(serve/servlet start
               #:launch-browser? #t
               #:quit? #f
               #:listen-ip #f
               #:port 8080
               #:extra-files-paths (list (build-path "js")
                                         (build-path "css"))
               #:servlet-path "")

假设上面的代码,localhost:8080/转到一个写"list-posts"的页面.打算localhost:8080/posts/test去球拍"未找到文件"页面(我希望它去一个页面,上面写着"审查,测试后").

感觉我错过了一些小而明显的东西.任何人都可以给我一个提示吗?

小智 12

你写的不是一个完整的程序,所以我无法调试它.

这是一个带有注释的程序,可以执行您想要的操作:

#lang scheme ; specify the right language
; include the correct libraries
(require web-server/servlet
         ; this one gets "serve/servlet"
         web-server/servlet-env)

(define (start request)
  (blog-dispatch request))

(define-values (blog-dispatch blog-url)
  (dispatch-rules
   (("") list-posts)
   (("posts" (string-arg)) review-post)
   (("archive" (integer-arg) (integer-arg)) review-archive)
   (else list-posts)))

(define (list-posts req) `(list-posts))
(define (review-post req p) `(review-post ,p))
(define (review-archive req y m) `(review-archive ,y ,m))

; starts a web server where...
(serve/servlet start ; answers requests
               #:servlet-path "" ; is the default URL
               #:port 8080 ; is the port
               #:servlet-regexp #rx"") ; is a regexp decide
                                       ; if 'start' should
                                       ; handle the request
Run Code Online (Sandbox Code Playgroud)

因为函数list-posts,review-post并且review-archive不返回HTML的合理的xexpr编码,所以你必须查看源代码才能正确看到它们.

请随时给我发电子邮件或发送电子邮件到PLT计划邮件列表.(注意:我们正在将PLT Scheme重命名为"Racket",以便您在发布时看到.)

杰伊麦卡锡