Как отправить данные на сервер Racket? - PullRequest
0 голосов
/ 25 мая 2019

Изменение онлайн-примера У меня есть следующий код, который позволяет сделать http-запрос на этот веб-сервер Racket:

#lang racket

(require web-server/servlet) 
(require web-server/servlet-env)

(define (http-response content)  
  (response/full
    200                  ; HTTP response code.
    #"OK"                ; HTTP response message.
    (current-seconds)    ; Timestamp.
    TEXT/HTML-MIME-TYPE  ; MIME type for content.
    '()                  ; Additional HTTP headers.
    (list                ; Content (in bytes) to send to the browser.
      (string->bytes/utf-8 content))))

(define (show-time-page request)
  (http-response (number->string (current-seconds))))

(define (greeting-page request)  
  (http-response (list-ref '("Hi" "Hello") (random 2))))

 (define get-data ...)

;; URL routing table (URL dispatcher).
(define-values (dispatch generate-url)
  (dispatch-rules
    [("time") show-time-page]
    [("hello") greeting-page]  ; Notice this line.
    [else (error "There is no procedure to handle the url.")]))

(define (request-handler request)
  (dispatch request))

;; Start the server.
(serve/servlet
  request-handler
  #:launch-browser? #f
  #:quit? #f
  #:listen-ip "127.0.0.1"
  #:port 8001
  #:servlet-regexp #rx"")

Как мне изменить вышеуказанный код, чтобы разрешить егополучить данные (например, строку), опубликованные на веб-сервере Racket через http-запрос, и отобразить их в консоли?Пожалуйста, вы можете помочь?

1 Ответ

3 голосов
/ 26 мая 2019

Определите обработчик запроса для запроса POST. Пусть он извлечет опубликованные данные из request:

(define (example-post request)
  (define data (request-post-data/raw request))
  (define str (format "got post data: ~v" data))
  (displayln str)
  (http-response str))

Добавьте обработчик к dispatch-rules. Обязательно укажите, что он обрабатывает запрос POST (не по умолчанию GET):

;; URL routing table (URL dispatcher).
(define-values (dispatch generate-url)
  (dispatch-rules
    [("time") show-time-page]
    [("hello") greeting-page]
    [("example-post") #:method "post" example-post] ; <=== NEW
    [else (error "There is no procedure to handle the url.")]))

Теперь, в оболочке, если вы делаете

curl --data "hi" http://127.0.0.1:8001/example-post

он покажет данные ответа got post data: #"hi" --- как и консоль Racket.

...