2010-05-21 12 views
6

Estoy tratando de conectar el envío de URL con Racket (anteriormente PLT Scheme). He echado un vistazo al tutorial y la documentación del servidor. No puedo encontrar la forma de enrutar las solicitudes a los mismos servlets.Racket URL dispatch

Ejemplo específico:

 
#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 "")

Suponiendo que el código anterior, localhost:8080/ va a una página que dice "list-mensajes". Pasando al localhost:8080/posts/test va a una página de Racket "archivo no encontrado" (esperaría que vaya a una página que dice "revisión-publicación de prueba").

Parece que me falta algo pequeño y obvio. ¿Alguien puede darme una pista?

Respuesta

11

Lo que has escrito no es un programa completo, así que no puedo depurarlo.

Aquí es un programa con anotaciones que hace lo que quiere, probablemente:

#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 

Debido a que las funciones list-posts, review-post y review-archive no vuelven codificaciones xexpr sensibles de HTML, se tendrán que ver fuente para verlos bien.

No dude en enviarme un correo electrónico directamente o enviarme un correo electrónico a la lista de distribución de PLT Scheme. (Nota: Se está cambiando el nombre de PLT Scheme "raqueta" por lo que puede ver que cuando publique.)

Jay McCarthy

+0

Sip. Me faltaba el parámetro servlet-regexp. Como sospechaba; algo pequeño y obvio. Gracias por ayudarme. – Inaimathi

+0

Programa no laborable completo publicado en OP. – Inaimathi