Scheme 球拍URL调度规则

Scheme 球拍URL调度规则,scheme,lisp,racket,Scheme,Lisp,Racket,我遵循官方的racket示例进行基于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-po

我遵循官方的racket示例进行基于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服务器似乎工作正常。但当我真正点击主页(或其他)时,我会得到一个通用的“欢迎来到Racket”页面,而不是我在调度规则中指定的响应。如果我点击localhost:8080/posts/test,我会得到一个错误,即我指定的页面丢失了。我是否遗漏了一些明显的问题?

您的代码存在一些问题,尽管并非所有问题都是您的错。
web服务器
API有点奇怪,
service/servlet
API尤其奇怪

首先,如果要直接使用
service/servlet
API,则不应使用
#lang web server/insta
。如果要使用无状态servlet,请使用
#lang web服务器
,对于有状态servlet,请使用
#lang racket
#lang racket/base
。由于您当前编写的代码将使用
start
函数作为
web服务器/insta
的入口点,并调用
service/servlet
,因此您实际上启动了两次web服务器

其次,
service/servlet
的工作方式有点让人困惑:默认情况下,它只捕获您用
#:servlet路径
指定的路径上的请求。我发现这通常不是我想要的,因此您希望提供
: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)