球拍 URL 调度 [英] Racket URL dispatch

查看:33
本文介绍了球拍 URL 调度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 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-postsreview-postreview-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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆