2016-03-07 20 views
12

compojure-api kullanırken varsayılan değerle isteğe bağlı sorgu parametresini bildirmenin uygun yolu nedir? Benim rota elemanlarınınİsteğe bağlı sorgu parametreleri (varsayılan değerle) componentjure-api ile

One (this okuduktan sonra) şu şekildedir: İlk diğerleri olarak tanımlanan (örn show-future Boolean) fakat üretilen Swagger UI bir combobox olarak takdim boole params anda

(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 ...)) 

varsayılan olarak true değeriyle. Mevcut formda UI, hiçbir seçenek seçilmemiş bir açılan kutuyu gösterir. Aynı kiracı ile olur.

Tek taraflı soru: Bir istek göndermek için Swagger'ın oluşturduğu UI'yi kullandığımda ve hata döndüğünde: "levels": "(not (instance? java.lang.Integer \"2\"))". Neden? Kütüphane, dize değerlerini API tarafından bildirilen belirlenmiş türlere zorlamak/dönüştürmek değil mi?

Şimdiden teşekkürler.

cevap

5

İlk sayınız için, bu tasarlandığı şekilde çalışıyor. Boolean sorgu parametreniz gerektiğinde, Swagger sizi bir değer seçmeye zorlayan kullanıcı arayüzünü (true veya false, sadece ilk sırada gerçek gibi görünür) oluşturdu.

İsteğe bağlı olarak boolean sorgu parametresini değiştirdiğinizde, ilk boş değer "bu sorgu paramını hiç göndermeyin" anlamına gelir ve true veya false olarak değiştirmediğinizde buna eklenmez istek için sorgu param.

Tamsayı sorgu param ile ikinci sayınızla ilgili olarak: varsayılan olarak schema's json-coercion-matcher, String->Long coercion but not String->Integer belirtmektedir, bu nedenle kutudan Integer desteği yoktur. API'niz veya rotanız için global olarak kendi coercer'ınızı :coercion seçeneğini (there is an example in compojure-api test) kullanarak belirtebilirsiniz. Mevcut json-coercion-matcher'u String->Integer kasalı olarak genişletebilecek kendi kodlayıcıyı sağlayabilirsiniz.

+0

Cevabınız için teşekkürler. Yani, boole isteğe bağlı parametre hakkında, varsayılan değer UI'de seçilmediğinden, varsayılan bir değer tanımladığım fark etmez. –

+1

@ matheus.emm İsteğe bağlı olmasını istiyorsanız, varsayılan parametre değerini belirtmeniz gerekir. Aksi takdirde, Swagger UI, değerlerden birini ('true' veya' false') seçmenizi zorlar ve eğer bu sorgu parametresi için bir değer belirtmeden istek gönderirseniz, şema doğrulama hatası alırsınız. Varsayılan değer gereklidir, böylece parametreniz arayan tarafından sağlanmamışsa, geçerli bir değer atanır (şemanıza göre). –

+0

@ matheus.emm “Tamsayı” zorlama işleminin nasıl yapılacağı bilgisiyle cevabı güncelledim. –

İlgili konular