Swagger-Net - Documentazione dinamica: differenze tra le versioni
Nessun oggetto della modifica |
|||
| (2 versioni intermedie di uno stesso utente non sono mostrate) | |||
| Riga 26: | Riga 26: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Stessa solfa per il javascript. Perché dovrei mettere del javascript in una documentazione? Per esempio per personalizzare la favicon che da CSS non può essere alterata: | Stessa solfa per il javascript.<br/> | ||
Perché dovrei mettere del javascript in una documentazione?<br/> | |||
Per esempio per personalizzare la favicon che da CSS non può essere alterata: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
c.InjectJavaScript(thisAssembly, "DB_RestService.Content.js.swagger-custom.js"); | c.InjectJavaScript(thisAssembly, "DB_RestService.Content.js.swagger-custom.js"); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Il contenuto del js | Il contenuto del js potrebbe essere: | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
(function () { | (function () { | ||
| Riga 42: | Riga 44: | ||
})(); | })(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Aggiungere i commenti delle funzioni e delle proprietà dei modelli === | |||
Per fare in modo che Swagger inserisca anche le documentazioni inline scritte dallo sviluppatore<br/> | |||
è necessario abilitare la spunta '''XML documentation file''' dalle proprietà del progetto, pannello ''Build''.<br/> | |||
'''Remember''', abilitare la spunta per tutte le configurazioni (DEBUG; RELEASETEST, RELEASE). | |||
=== Gestione parametri Header (es. token) === | |||
Se le API sono protette da '''autenticazione con bearer token o basi authentication''' l'interfaccia di swagger deve dare la possibilità di effettuare l'autenticazione.<br/> | |||
Per aggiungere un nuovo campo di input con le specifiche adeguate si rende necessario: | |||
* Implementare l'interfaccia '''IOperationFilter''' (di Swagger.Net) | |||
* Notificare nella configurazione la presenza di questa implementazione | |||
<br/> | |||
Di seguito un esempio di implementazione di Bearer Token | |||
<syntaxhighlight lang="c#"> | |||
public class SwaggerOperationFilter : IOperationFilter { | |||
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { | |||
if (operation == null) | |||
return; | |||
if (operation.parameters == null) | |||
operation.parameters = new List<Parameter>(); | |||
Parameter authorizationParam = new Parameter { | |||
description = "Token da fornire per l'accesso al servizio", | |||
required = true, | |||
@in = "header", | |||
name = "Authorization", | |||
type = "string", | |||
@default = "Bearer " | |||
}; | |||
operation.parameters.Add(authorizationParam); | |||
operation.responses.Add("400", new Response { | |||
description = "I dati inviati sono errati o incompleti", | |||
examples = new Dictionary<string, object>() { | |||
{ "application/json", new { Message= "...messaggio di errore..." } } | |||
} | |||
}); | |||
operation.responses.Add("401", new Response { | |||
description = "Chiave di autorizzazione non valida o mancante", | |||
examples = new Dictionary<string, object>() { | |||
{ "application/json", new {Message= "Autorizzazione negata per la richiesta."} } | |||
} | |||
}); | |||
operation.responses.Add("500", new Response { | |||
description = "Si è verificato un errore durante l'esecuzione della procedura", | |||
examples = new Dictionary<string, object>() { | |||
{ "application/json", new {Message= "...messaggio di errore..."} } | |||
} | |||
}); | |||
} | |||
} | |||
</syntaxhighlight> | |||
Piazzato ad esempio in un folder <code>/Filters</code>.<br/><br/> | |||
All'interno di <code>SwaggerConfig.cs</code> segnalare l'operation filter appena implementato tramite la riga | |||
<syntaxhighlight lang="c#">c.OperationFilter<SwaggerOperationFilter>();</syntaxhighlight> | |||
dentro a <code>EnableSwagger("...", c=> { ... }...</code> | |||
Versione attuale delle 14:08, 6 ott 2021
Con il Framework 4.8 , in un un contesto di WebApi, Swagger interviene generando una documentazione interattiva HTML che prende come sorgente i modelli dei dati e le loro descrizioni da codice sorgente.
Pagina del progetto: https://github.com/heldersepu/Swagger-Net
Ecco come procedere, avendo già creato un WebApi/Rest-Service:
- Manage NuGet packages e installare
Swagger-Net - È possibile testare subito runnando la soluzione alla pagina
/swagger(se non funziona qui sono cazzi tuoi) - Si crea in automatico un file
App_Start/SwaggerConfig.cs, centralizzato, dal quale è possibile configurare tutto.
Route personalizzata
[modifica]Siccome runnare su /swagger ci fa schifo, cambiamo l'impostazione della route aggiungendo il parametro routeTemplate alla configurazione di Swagger e SwaggerUI (in /App_Start/SwaggerConfig.cs)
GlobalConfiguration.Configuration.EnableSwagger("docs/{apiVersion}", c => { c.SingleApiVersion("v1", "Designbest REST-API"); /* ... */ })
GlobalConfiguration.Configuration.EnableSwaggerUi("doc/{*assetPath}", c => { c.DocumentTitle("Designbest REST-API"); /* ... */ })
In questo modo runniamo su /doc/index (ricordiamoci /index!).
Iniettare CSS e JavaScript
[modifica]Per personalizzare i colori dell'interfaccia della documentazione è possibile inserire un proprio CSS custom.
- Creare un file CSS in un percorso dell'applicazione, es
/Content/css/swagger-custom.css - Cliccare sulle proprietà e nella Build Action impostare Embedded Resource (e Copy to Output directory mettere Copy always)
- A questo punto il nome logico della risorsa sarà
App_Namespace.Folder.File, ad esDB_RestService.Content.css.swagger-custom.css - Dalle impostazioni della SwaggerUI usare il comando:
c.InjectStylesheet(thisAssembly, "DB_RestService.Content.css.swagger-custom.css");
Stessa solfa per il javascript.
Perché dovrei mettere del javascript in una documentazione?
Per esempio per personalizzare la favicon che da CSS non può essere alterata:
c.InjectJavaScript(thisAssembly, "DB_RestService.Content.js.swagger-custom.js");
Il contenuto del js potrebbe essere:
(function () {
var link = document.querySelector("link[rel*='icon']") || document.createElement('link');
document.head.removeChild(link);
link = document.querySelector("link[rel*='icon']") || document.createElement("link");
link.type = "image/x-icon";
link.rel = "shortcut icon";
link.href = "https://www.designbest.com/favicon.png";
document.getElementsByTagName("head")[0].appendChild(link);
})();
Aggiungere i commenti delle funzioni e delle proprietà dei modelli
[modifica]Per fare in modo che Swagger inserisca anche le documentazioni inline scritte dallo sviluppatore
è necessario abilitare la spunta XML documentation file dalle proprietà del progetto, pannello Build.
Remember, abilitare la spunta per tutte le configurazioni (DEBUG; RELEASETEST, RELEASE).
Gestione parametri Header (es. token)
[modifica]Se le API sono protette da autenticazione con bearer token o basi authentication l'interfaccia di swagger deve dare la possibilità di effettuare l'autenticazione.
Per aggiungere un nuovo campo di input con le specifiche adeguate si rende necessario:
- Implementare l'interfaccia IOperationFilter (di Swagger.Net)
- Notificare nella configurazione la presenza di questa implementazione
Di seguito un esempio di implementazione di Bearer Token
public class SwaggerOperationFilter : IOperationFilter {
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) {
if (operation == null)
return;
if (operation.parameters == null)
operation.parameters = new List<Parameter>();
Parameter authorizationParam = new Parameter {
description = "Token da fornire per l'accesso al servizio",
required = true,
@in = "header",
name = "Authorization",
type = "string",
@default = "Bearer "
};
operation.parameters.Add(authorizationParam);
operation.responses.Add("400", new Response {
description = "I dati inviati sono errati o incompleti",
examples = new Dictionary<string, object>() {
{ "application/json", new { Message= "...messaggio di errore..." } }
}
});
operation.responses.Add("401", new Response {
description = "Chiave di autorizzazione non valida o mancante",
examples = new Dictionary<string, object>() {
{ "application/json", new {Message= "Autorizzazione negata per la richiesta."} }
}
});
operation.responses.Add("500", new Response {
description = "Si è verificato un errore durante l'esecuzione della procedura",
examples = new Dictionary<string, object>() {
{ "application/json", new {Message= "...messaggio di errore..."} }
}
});
}
}
Piazzato ad esempio in un folder /Filters.
All'interno di SwaggerConfig.cs segnalare l'operation filter appena implementato tramite la riga
c.OperationFilter<SwaggerOperationFilter>();
dentro a EnableSwagger("...", c=> { ... }...