【问题标题】:Racket URL Dispatch Rules球拍 URL 调度规则
【发布时间】:2016-05-22 19:59:02
【问题描述】:

我正在关注基于 URL 的调度的官方球拍示例,但似乎无法使其正常工作。

#lang web-server/insta  
(require web-server/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)
   (else list-posts)))

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

(serve/servlet start
               #:servlet-path ""
               #:port 8080)

当我运行 .rkt 文件时,Web 服务器似乎工作正常。但是当我真正点击主页(http://localhost:8080/ 或其他)时,我得到一个通用的“欢迎来到 Racket”页面,而不是我在调度规则中指定的响应。如果我点击 localhost:8080/posts/test,我会收到我指定的页面丢失的错误。我在这里遗漏了什么明显的东西吗?

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    您的代码存在一些问题,但并非所有问题都是您的错。 web-server API 有点奇怪,serve/servlet API 尤其如此。

    首先,如果你想直接使用serve/servlet API,你应该使用#lang web-server/insta。如果您想使用无状态 servlet,请改用 #lang web-server,或使用 #lang racket#lang racket/base 用于有状态的 servlet。由于您的代码当前正在编写,它将使用start 函数作为web-server/insta 的入口点以及serve/servlet 的调用,因此您实际上是在启动一个Web 服务器两次 .

    其次,serve/servlet 的工作方式有点令人困惑:默认情况下,它只捕获您使用 #:servlet-path 指定的路径上的请求。我发现这通常不是我想要的,所以你想提供#:servlet-regexp #rx"" 以允许 servlet 处理对任何路径的请求。

    最后,您的 servlet 函数本身不会返回有效响应。您可能想要返回某种 JSON 或 HTML。您需要构建一个响应结构并返回它,但您可以使用像 response/xexpr 这样的辅助函数来轻松完成。

    进行所有这些更改后,您的代码应如下所示:

    #lang racket/base
    
    (require web-server/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)
       (else list-posts)))
    
    (define (list-posts req)
      (response/xexpr `(html (body "list-posts"))))
    (define (review-post req p)
      (response/xexpr `(html (body (div "review-post: " ,p)))))
    
    (serve/servlet start
                   #:servlet-path "/"
                   #:servlet-regexp #rx""
                   #:port 8080)
    

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 2018-07-04
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多