2013-09-27 2 views
3

Я не смог найти документацию о том, как отправлять по методу HTTP (на том же uri). Ближайшим я получил :default-request-type на define-easy-handler - но это, кажется, отправку последнего, даже если я использую метод GET:Отправка Hunchentoot по HTTP-методу

(define-easy-handler (index :uri "/" :default-request-type :get)() 
    (log-message* :info "GET on index ------ ") 
    (format nil "Hello World")) 

(define-easy-handler (echo :uri "/" :default-request-type :post)() 
    (log-message* :info "POST on index ------ ") 
    (format nil "~S" (raw-post-data :force-text t))) 
+1

От взгляда на исходный код казалось бы, что 'default-requiest-type' влияет только на то, что« аргументы »учитываются при вызове обработчика. Это не влияет на вызов обработчика. Таким образом, похоже, что вы сами выполняете это. –

+0

Спасибо за то, что посмотрели в источник для меня :) Думаю, мне нужно будет что-то реализовать самостоятельно для него – mck

ответ

2

много рамок, построенных на вершине Hunchentoot есть что. Restas и Caveman - всего лишь два примера. Например, в Restas вы можете сказать:

(restas:define-route foo ("/foo" :method :get) 
    ; some code here 
) 

(restas:define-route foo/post ("/foo" :method :post) 
    ; some other code here 
) 
+0

Спасибо за указатели - я изучил использование Caveman, но вернулся к Hunchentoot после этого [вопроса] (https://github.com/xach/buildapp/issues/13) – mck

2

(возможно, немного обманчиво по имени) :uri параметра разрешено быть либо строкой, либо предикат на объекте запроса. Таким образом, вы можете передать туда функцию, которая проверяет соответствие метода и пути. Я написал макрос, чтобы сделать его красивее:

(defmacro method-path (methods path) 
    "Expands to a predicate the returns true of the Hunchtoot request 
has a SCRIPT-NAME matching the PATH and METHOD in the list of METHODS. 
You may pass a single method as a designator for the list containing 
only that method." 
    (declare 
    (type (or keyword list) methods) 
    (type string path)) 
    `(lambda (request) 
    (and (member (hunchentoot:request-method* request) 
       ,(if (keywordp methods) 
         `'(,methods) 
         `',methods)) 
      (string= (hunchentoot:script-name* request) 
        ,path)))) 

(hunchentoot:define-easy-handler (get-handler :uri (method-path :get "/hello"))() 
    "hello!") 

(hunchentoot:define-easy-handler (post-handler :uri (method-path (:post :put) "/hello"))() 
    "a post or a put!") 

В том случае, когда будет найден путь, но этот метод не мы, вероятно, следует возвращать ошибку HTTP 405 вместо ошибки 404, что Hunchentoot не возвращается, если нет обработчиков совпадение. Чтобы сделать это, вы можете вручную написать обработчик catch-all для каждого вашего пути. Предполагается, что ответ 405 включает список приемлемых методов, и я не могу придумать простой способ генерировать один из них, не изменяя define-easy-handler, чтобы напрямую поддерживать специализацию по методу, что может быть хорошей идеей.

Смежные вопросы