我遵循官方的基于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/或其他什么)时,我会得到一个通用的“欢迎进入球拍”页面,而不是我在调度规则中指定的响应。如果我点击localhost:8080/post/test,就会发现我指定的页面丢失了一个错误。我是不是漏掉了什么明显的东西?
发布于 2016-05-23 01:47:26
您的代码有一些问题,尽管并不是所有的问题都是您的错。web-server
API有点奇怪,尤其是serve/servlet
API。
首先,如果您想直接使用#lang web-server/insta
API,就不应该使用serve/servlet
。如果您想使用无状态servlet,或者对有状态servlet使用#lang web-server
或#lang racket/base
,则使用#lang racket
或#lang racket/base
。由于您的代码是当前编写的,它将使用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)
https://stackoverflow.com/questions/37379042
复制相似问题