2010-05-21 24 views
6

Próbuję połączyć wysyłkę adresu URL z Racket (dawniej PLT Scheme). Przyjrzałem się samouczkowi i dokumentacji serwera. Nie mogę wymyślić, jak przekierować żądania do tych samych serwletów.Wywołanie adresu URL rakiety

Specjalny przykład:

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

Zakładając powyższy kod, localhost:8080/ przechodzi do strony, która mówi „lista słupki”. Przejście na stronę localhost:8080/posts/test powoduje przejście do strony "Nie znaleziono pliku" (oczekuje, że przejdzie do strony z napisem "test sprawdzający pocztę").

Czuję, że brakuje mi czegoś małego i oczywistego. Czy ktoś może mi podpowiedzieć?

Odpowiedz

11

To, co napisałeś, nie jest całym programem, więc nie mogę go debugować.

Oto program z adnotacjami, że robi to, co chcesz, prawdopodobnie:

#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 

Ponieważ funkcje list-posts, review-post i review-archive nie zwracają sensowne kodowania xexpr HTML, będziesz musiał zobaczyć źródło, aby je dobrze widzieć.

Proszę wysłać mi wiadomość e-mail bezpośrednio lub wyślij mailem na listę mailingową PLT Scheme. (Uwaga: Jesteśmy PLT Scheme zmiana nazwy na "Rakieta", więc można zobaczyć, że kiedy piszesz.)

Jay McCarthy

+0

Tak. Brakowało mi parametru servlet-regexp. Jak podejrzewałem; coś małego i oczywistego. Dziękuję, że mi pomogłeś. – Inaimathi

+0

Opublikowany kompletny program niedziałający w OP. – Inaimathi