球拍 URL 调度规则
Racket URL Dispatch Rules
我正在按照基于 URL 的调度的官方 racket 示例进行操作,但似乎无法使其正常工作。
#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 文件时,网络服务器似乎工作正常。但是当我实际访问主页(http://localhost:8080/ 或其他)时,我得到一个通用的 "Welcome to Racket" 页面,而不是我在调度规则中指定的响应。如果我点击 localhost:8080/posts/test,我会收到一条错误消息,指出我指定的页面丢失了。我在这里遗漏了什么明显的东西吗?
您的代码存在一些问题,但并非所有问题都是您的错。 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 函数本身不会 return 有效响应。您可能想要 return 某种 JSON 或 HTML。您需要构建一个响应结构和 return,但是您可以使用像 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)
我正在按照基于 URL 的调度的官方 racket 示例进行操作,但似乎无法使其正常工作。
#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 文件时,网络服务器似乎工作正常。但是当我实际访问主页(http://localhost:8080/ 或其他)时,我得到一个通用的 "Welcome to Racket" 页面,而不是我在调度规则中指定的响应。如果我点击 localhost:8080/posts/test,我会收到一条错误消息,指出我指定的页面丢失了。我在这里遗漏了什么明显的东西吗?
您的代码存在一些问题,但并非所有问题都是您的错。 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 函数本身不会 return 有效响应。您可能想要 return 某种 JSON 或 HTML。您需要构建一个响应结构和 return,但是您可以使用像 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)