2015-07-20 5 views
7

Obiettivo: Sto progettando un'API REST che consente all'utente di passare parametri sulla stringa di query per una richiesta HTTP GET. Qualcosa di simileModifica il nome del parametro per Swagger JSON generato tramite Swashbuckle in .NET Web API 2

http://fake.api.com/search?api-key=1235&term=car&rows=10 

Implementazione: sul lato server Ho un modello legante che prende i 3 parametri - API-chiave, termine, e le righe e li converte in un oggetto C# in modo che il mio metodo di azione del controller non deve analizzare la stringa di query. Quindi la firma del metodo azione di controllo simile a

public IHttpActionResult Get(RequestObject request) 

Problema: quello che sto funzionando in con Swagger è quando si genera la documentazione e il test harness, è che elenca i parametri di input come request.api-chiave , request.term e request.rows. Questo perché JSON sta ricevendo dal server sta anteponendo il nome dell'oggetto a questi valori. Così, quando si tenta di utilizzare Swagger UI per fare una richiesta HTTP GET, si costruisce l'URL come

http://fake.api.com/search?request.api-key=1235&request.term=car&request.rows=10 

Che è una richiesta non corretta per il server. Ora posso facilmente rendere più intelligente il mio modello legacy per ignorare semplicemente la "richiesta". parte, ma sembra un modo arretrato per risolvere questo problema.

Domanda: come posso personalizzare JSON generato da Swashbuckle -> Swagger sul lato server in modo che i nomi dei parametri per questo particolare oggetto non siano preceduti dal nome dell'oggetto? Ho esaminato sia ISchemaFilter che IDocumentFilter che l'API di estensibilità di Swashbuckle espone, ma non vedo un modo pulito per farlo. Può essere possibile, ma un esempio potrebbe essere d'aiuto in questo caso.

risposta

3

Trovato una soluzione, che si è rivelata essere l'unica cosa che ho ignorato - IOperationFilter. Vedi https://github.com/domaindrivendev/Swashbuckle/issues/128 per i dettagli.

+0

si può indicare quale parte del link fornito era di interesse? Hai dovuto implementare la logica da solo (dividere il nome con ".) O era un built-in swashbuckle che hai appena dovuto chiamare in IOperationFilter? – ke3pup

+0

Ho appena usato l'IOperationFilter, e sì ho diviso su". "Manualmente, no Magia lì, un modo più elegante sarebbe quello di decorare ogni proprietà di quella classe e riflettere e quindi analizzare questi, ma sono stato premuto in tempo, quindi sono andato con la soluzione meno elegante di analizzarlo. – codelove

+0

Sai Baba è ora in grado di farlo senza questo soluzione alternativa? +1 per 'IOperationFilter' non sapeva nemmeno che esistesse una cosa del genere lol. – Barak

0

Ho riscontrato un problema simile e ho trovato una soluzione semplice.

Anche se nel mio caso era per POST/PUT, it won't work for GET since GET doesn't have a body. Una volta usato l'Attribute FromBody, Swagger ha iniziato a eseguire il rendering di un JSON corretto senza prefissi. Quindi, nel mio caso sembrava qualcosa di simile:

public IHttpActionResult Post([FromBody]RequestObject request) 

Essa non risponde direttamente alla tua domanda, ma ero alla ricerca di una soluzione a un simile problema legato spavalderia, ed è questo che mi ha aiutato, quindi spero che può essere utile per chiunque.

2
public IHttpActionResult Get([FromUri(Name = "")] RequestModel model) 

Rimuove la "RequestModel" dall'inizio di immobili a stringa di query