2010-05-21 15 views
6

J'essaie de raccorder l'envoi d'URL avec Racket (anciennement PLT Scheme). J'ai regardé le tutoriel et la documentation du serveur. Je n'arrive pas à comprendre comment acheminer les demandes vers les mêmes servlets.Expédition de l'URL de la raquette

exemple spécifique:

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

En supposant que le code ci-dessus, localhost:8080/ va vers une page qui dit "liste-postes". Aller à localhost:8080/posts/test va à une page "fichier non trouvé" de la raquette (je m'attendrais à ce qu'il se rende à une page qui dit "review-post test").

Il me semble qu'il me manque quelque chose de petit et d'évident. Quelqu'un peut-il me donner un indice?

Répondre

11

Ce que vous avez écrit n'est pas un programme complet, donc je ne peux pas le déboguer.

Voici un programme avec annotations qui fait ce que vous voulez, sans doute:

#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 

Parce que les fonctions list-posts, review-post et review-archive ne reviennent pas encodages xexpr sensibles de HTML, vous aurez à voir source pour les voir correctement.

N'hésitez pas à m'envoyer un courriel directement ou à envoyer par courriel la liste de diffusion de PLT Scheme. (Note: Nous Changement de nom PLT Scheme à "Racket" de sorte que vous pouvez voir que lorsque vous postez.)

Jay McCarthy

+0

Eh oui. Il me manquait le paramètre servlet-regexp. Comme je le soupçonnais; quelque chose de petit et d'évident. Merci de m'avoir aidé. – Inaimathi

+0

Publié programme complet non-travail dans OP. – Inaimathi