Как использовать необязательные параметры запроса в Yada?

Я делаю игрушечный API, используя библиотеку Yada в Clojure. Он ищет в базе данных названия городов, начинающиеся с заданных символов, и возвращает некоторую информацию о них.

Мне нужен URI в форме: /cities/:name?count=:count так например /cities/ber?count=4вернет 4 лучших матча. Но я тоже хочу/cities/ber без ?count= для возврата количества результатов по умолчанию (скажем, только первого).

Я определил свой маршрут и обработчик yada следующим образом:

(defn city-search-fn
  [ctx]
  (let [name (get-in ctx [:parameters :path :name])
        count (get-in ctx [:parameters :query :count] 1)]
    (city->geoposition name count)))

(def cities (yada/handler (yada/resource 
                            {:methods 
                             {:get
                              {:parameters {:path {:name String}
                                            :query {:count Long}}
                               :produces ["application/json"
                                          "application/edn"]
                               :response city-search-fn}}})))

(def routes
  [["/cities/" :name] cities])

(def server
  (yada/listener routes {:port 30000}))

Это отлично работает, если я поставлю ?count= параметр запроса:

$ curl -i 'http://localhost:30000/cities/ber?count=2'
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Length: 259
Content-Type: application/json
Vary: accept
Server: Aleph/0.4.4
Connection: Keep-Alive
Date: Mon, 09 Sep 2019 16:01:45 GMT

[{"name":"Berlin","state":"Berlin","countrycode":"DE","timezone":"Europe/Berlin","latitude":52.52437,"longitude":13.41053},{"name":"Berbera","state":"Woqooyi Galbeed","countrycode":"SO","timezone":"Africa/Mogadishu","latitude":10.43959,"longitude":45.01432}]

Но я получаю статус 400 ({:status 400, :errors ([:query {:error {:count missing-required-key}}])}) если я его не предоставлю:

$ curl -i 'http://localhost:30000/cities/ber'
HTTP/1.1 400 Bad Request
Content-Length: 77
Content-Type: text/plain;charset=utf-8
Server: Aleph/0.4.4
Connection: Keep-Alive
Date: Mon, 09 Sep 2019 16:06:56 GMT



{:status 400, :errors ([:query {:error {:count missing-required-key}}])}

В документации yada говорится, что он поддерживает дополнительные параметры запроса с использованием библиотеки "schema". Итак, я обнаружил в документации схемы, что существуетschema.core/maybeфункция. Я попытался изменить свой ресурс yada следующим образом:

:parameters {:path.....
             :query (schema/maybe {:count Long})}

это не работает (та же ошибка 400).

Потом попробовал:

:parameters {:path.....
             :query {:count  (schema/maybe Long)}}

это тоже не сработало.

Итак, мой вопрос: как правильно использовать необязательный параметр запроса в yada?

1 ответ

Чтобы ответить на мой собственный вопрос, углубившись в документацию по схеме, вот правильный способ:

:parameters {:path.....
             :query {(schema/optional-key :count) Long}}

Сам ключ нужно пометить как необязательный.

Другие вопросы по тегам