Compojure-api удаляет body-param после первой группы маршрутов API
В настоящее время я использую шаблон Luminus с опцией +swagger, которая добавляет поддержку compojure-api.
Моя текущая настройка выглядит так (только соответствующие биты):
(ns my-project.routes.services
(:require [compojure.api.sweet :refer :all]
,,,)
(defapi service-routes
(POST "/login" req
:return Result
:body [user UserLogin]
:summary "Log the user in"
(auth/login! req user))
(defapi restricted-service-routes
(POST "/login2" req
:return Result
:body [user UserLogin]
:summary "Log the user in"
(auth/login! req user)))
а также
(ns my-project.handler)
(:require [my-project.routes.services :refer :all])
(defroutes app-routes
#'service-routes
#'restricted-service-routes)
Когда сервер получает запрос, он передается app-routes
, Затем я использовал интерфейс Swagger для тестирования этих маршрутов, и "/login"
Трасса работала нормально. Тем не менее, полностью аналогичные "/login2"
возвращается
{
"errors": "(not (map? nil))"
}
Когда я переключаю порядок двух сервисных групп, результат будет таким, как ожидалось: первый маршрут работает нормально, а второй не получит body
,
Это ошибка с самим Compojure-api? И что я могу сделать, чтобы обойти это?
1 ответ
defapi
Макрос, кажется, обернуть все маршруты api-middleware
(посмотрите исходный код compojure-api), который включает wrap-params
промежуточное программное обеспечение. В вашей настройке вы объединяете два набора маршрутов, оба обернутые в api-middleware
и, таким образом, называя wrap-params
промежуточное ПО по запросу в случае второго defapi
маршрут (/login2) дважды. Первый звонок wrap-params
разрешает параметры правильно, но второй wrap-params
вызов не имеет ничего для обработки, и поэтому ваш код заканчивается ошибкой во время выполнения.
Чтобы решить вашу проблему, попробуйте отключить упаковку по умолчанию api-middleware
для всех ваших defapi
использования, но один. Увидеть :disable-api-middleware
вариант по ссылке выше.