球拍 URL 调度 [英] Racket URL dispatch
问题描述
我正在尝试使用 Racket(以前称为 PLT Scheme)连接 URL 调度.我查看了教程和服务器文档.我不知道如何将请求路由到相同的 servlet.
具体例子:
<前>#lang 方案(需要网络服务器/servlet)(需要网络服务器/调度)(提供/合同(开始(请求?.->.响应/c)))(定义(启动请求)(博客发送请求))(define-values (blog-dispatch blog-url)(调度规则(("") 列表帖子)(("posts" (string-arg)) review-post)(("archive" (integer-arg) (integer-arg)) review-archive)(其他列表帖子)))(定义(列表帖子请求)`(列表帖子))(定义 (review-post req p) `(review-post ,p))(define (review-archive req y m) `(review-archive ,y ,m))(需要 web-server/servlet-env)(服务/servlet 启动#:启动浏览器?#t#:放弃?#F#:listen-ip #f#:8080端口#:extra-files-paths (list (build-path "js")(构建路径css"))#:servlet-path "")假设上面的代码,localhost:8080/
转到一个页面,上面写着list-posts".转到 localhost:8080/posts/test
会转到 Racket未找到文件"页面(我希望它会转到显示评论-发布测试"的页面).
感觉好像我错过了一些小而明显的东西.谁能给个提示?
你写的不是一个完整的程序,所以我无法调试.
这是一个带有注释的程序,可以执行您想要的操作,可能是:
#lang 方案;指定正确的语言;包括正确的库(需要网络服务器/servlet;这个得到服务/servlet"网络服务器/servlet-env)(定义(启动请求)(博客发送请求))(define-values (blog-dispatch blog-url)(调度规则(("") 列表帖子)(("posts" (string-arg)) review-post)(("archive" (integer-arg) (integer-arg)) review-archive)(其他列表帖子)))(定义(列表帖子请求)`(列表帖子))(定义 (review-post req p) `(review-post ,p))(define (review-archive req y m) `(review-archive ,y ,m));启动一个 Web 服务器,其中...(serve/servlet start ; 回答请求#:servlet-path "" ;是默认网址#:端口 8080 ;是港口#:servlet-regexp #rx"") ;是一个正则表达式决定;如果开始"应该;处理请求
因为函数 list-posts
、review-post
和 review-archive
不返回 HTML 的合理 xexpr 编码,你必须查看源代码才能正确查看它们.
请随时直接给我发电子邮件或通过电子邮件发送 PLT Scheme 邮件列表.(注意:我们将 PLT Scheme 重命名为Racket",以便您在发帖时可以看到.)
杰伊·麦卡锡
I'm trying to hook up URL dispatch with Racket (formerly PLT Scheme). I've taken a look at the tutorial and the server documentation. I can't figure out how to route requests to the same servlets.
Specific example:
#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 "")
Assuming the above code, localhost:8080/
goes to a page that says "list-posts". Going to localhost:8080/posts/test
goes to a Racket "file not found" page (I'd expect it to go to a page that says "review-post test").
It feels like I'm missing something small and obvious. Can anyone give me a hint?
What you've written is not a whole program, so I cannot debug it.
Here is a program with annotations that does what you want, probably:
#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
Because the functions list-posts
, review-post
, and review-archive
don't return sensible xexpr encodings of HTML, you'll have to view source to see them right.
Please feel free to email me directly or email the PLT Scheme mailing list. (Note: We are renaming PLT Scheme to "Racket" so you may see that when you post.)
Jay McCarthy
这篇关于球拍 URL 调度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!