首页 文章

Racket URL调度

提问于
浏览
6

我正在尝试使用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 转到一个Racket "file not found"页面(我希望它转到一个说"review-post test"的页面) .

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

1 回答

  • 11

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

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

    #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
    

    因为函数 list-postsreview-postreview-archive 必须查看源代码才能看到它们 .

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

    杰伊麦卡锡

相关问题