2010-05-21 12 views
6

Sto provando ad agganciare l'invio di URL con Racket (precedentemente PLT Scheme). Ho dato un'occhiata al tutorial e alla documentazione del server. Non riesco a capire come indirizzare le richieste agli stessi servlet.Invio URL racket

esempio specifico:

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

Supponendo che il codice di cui sopra, localhost:8080/ va ad una pagina che dice "list-post". Passare a localhost:8080/posts/test passa a una pagina "file non trovata" di Racket (mi aspetto che vada a una pagina che dice "test post-recensione").

Mi sembra che manchi qualcosa di piccolo e ovvio. Qualcuno può darmi un suggerimento?

risposta

11

Quello che hai scritto non è un intero programma, quindi non posso eseguire il debug.

Ecco un programma con annotazioni che fa quello che si vuole, probabilmente:

#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 

Poiché le funzioni list-posts, review-post, e review-archive non tornare codifiche xexpr sensibili di HTML, si dovrà vedere fonte di vederli bene.

Non esitate a scrivermi direttamente via e-mail o alla mailing list PLT Scheme. (Attenzione: stiamo rinominando PLT Scheme a "Racket", così si può vedere che quando si posta.)

Jay McCarthy

+0

Yup. Mi mancava il parametro servlet-regexp. Come sospettavo; qualcosa di piccolo e ovvio. Grazie per avermi aiutato. – Inaimathi

+0

Inviato completo programma non funzionante in OP. – Inaimathi