2016-03-07 65 views
12

使用compojure-api时声明可选查询参数的默认值的正确方法是什么?使用compojure-api的可选查询参数(带缺省值)

我的一个路径元素的如下(读取this后):

(GET "/:id/descendants" [id] 
    :return [d/CategoryTreeElement] 
    :path-params [id :- Long] 
    :query-params [context-type :- d/ContextType 
        levels :- Integer 
        {tenant :- d/Tenant :DEF_TENANT} 
        {show-future :- Boolean false} 
        {show-expired :- Boolean false} 
        {show-suppressed :- Boolean false} 
    :summary "Fetch category descendants" 
    (ok ...)) 

起初,其中定义为其他的(例如show-future Boolean),但所生成的扬鞭UI呈现它们作为组合框布尔PARAMS默认值为true。在目前的形式中,用户界面显示了一个没有选择选项的组合框。租户也是如此。

一方面的问题:当我使用Swagger生成的UI发送请求并返回错误时:"levels": "(not (instance? java.lang.Integer \"2\"))"。这是为什么?库不是应该强制/将字符串值转换为由API声明的指定类型吗?

在此先感谢。

回答

5

对于你的第一个问题,这是按照设计工作。当你需要你的布尔查询参数时,Swagger呈现了UI,这迫使你选择一个值(truefalse,它恰好在第一位显示为真)。

当你改变布尔查询参数是可选的,那么第一个空值表示“完全不发送这个查询参数”,当你不将其更改为truefalse它不会追加此查询参数到请求。

关于你的第二个问题与整数查询参数:默认schema's json-coercion-matcher指定String->Long coercion but not String->Integer所以不支持Integer开箱即用。您可以使用:coercion选项(there is an example in compojure-api test)在全球范围内为您的API或每条路线指定自己的强制程序。你可以提供你自己的强制,这可能会扩大现有的json-coercion-matcherString->Integer的情况。

+0

谢谢你的回答。所以关于布尔可选参数,如果我定义一个默认值并不重要,因为在UI上没有选择默认值。 –

+1

@ matheus.emm如果您希望它是可选的,您必须指定默认参数值。否则Swagger UI会强制你选择其中一个值('true'或'false'),如果你发送的请求没有为该查询参数指定一个值,你会得到schema验证错误。默认值是必需的,所以如果你的参数没有被调用者提供,那么你的参数有一个有效的值(根据你的模式)。 –

+0

@ matheus.emm我已经更新了如何处理Integer强制的信息。 –