Írtam már arról, hogy a Microsoft.AspNet.WebApi.HelpPage NuGet csomaggal milyen könnyen generálhatunk dokumentációt a WebAPI-nkhoz. Mint minden készen kapott megoldással, ezzel is akkor kezdődnek a nehézségek, amikor az ember olyasmit szeretne, amire helyből nincs felkészítve. Szerencsére ebben az esetben a teljes forráskód rendelkezésre áll, így viszonylag egyszerűen testreszabhatjuk a működést és a megjelenést.
Példaként tegyük fel, hogy az API-nk úgy épül fel, hogy minden action hiba esetén a hozzá tartozó enum valamelyik elemét adja vissza hibakódnak a hozzá tartozó hibaüzenettel együtt, és a feladat az, hogy ezek a hibakódok megjelenjenek a dokumentációnkban.
Egy saját attribútummal – amit itt ErrorCodeType-nak hívtam, – könnyen hozzákapcsolhatjuk a hibakódokat tartalmazó enumot (itt MyErrorCodeEnum) az actionhöz:
[ErrorCodeType(typeof(MyErrorCodeEnum))]
Ezt az információt a következő lépésekkel tehetjük bele a dokumentációba:
1. A Models mappába hozzunk létre egy új osztályt, ami majd egy konkrét hibaág leírására lesz alkalmas, hívjuk ezt ErrorCodeDescription-nek:
public class ErrorCodeDescription
{
public int Code { get; set; }
public string Message { get; set; }
}
2. A HelpPageApiModel.cs fájl írja le azt a view-modellt, ami alapján a dokumentáció oldal megjelenik. Ebbe az osztályba vegyünk fel egy új tulajdonságot, ami az összes hibalehetőséget fogja tartalmazni egy listában:
public List<ErrorCodeDescription> ErrorResponses { get; set; }
3. A HelpPageConfigurationExtensions.cs fájlban található az a GenerateApiModel metódus, ami felépíti a HelpPageApiModel típusú apiModel nevű változóban található view-modellt. Itt a meglévőek mintájára készíthetünk egy saját metódust, ami kiolvassa a csatolt attribútumot, és az alapján felépíti az ErrorResponses listát, például így:
private static void GenerateErrorResponses(HelpPageApiModel apiModel)
{
ErrorCodeTypeAttribute attribute = apiModel.ApiDescription.ActionDescriptor
.GetCustomAttributes<ErrorCodeTypeAttribute>().FirstOrDefault();
Type enumType = attribute.ErrorCodeEnumType;
string[] names = Enum.GetNames(attribute.ErrorCodeEnumType);
foreach (string name in names)
{
apiModel.ErrorResponses.Add(new ErrorCodeDescription
{
Code = (int) Enum.Parse(enumType, name),
Message = "TODO"
});
}
}
4. A modell kirenderelését a Views/Help/DisplayTemplates/HelpPageApiModel.cshtml nézet végzi. A meglévő kódok mintájára ide felvehetjük az alábbi blokkot, ami az ErrorResponses lista megjelenítését az ErrorResponses partial view-ra bízza:
@if (Model.ErrorResponses.Any())
{
<h3>Error Responses</h3>
@Html.DisplayFor(m => m.ErrorResponses, "ErrorResponses")
}
5. Természetesen létre kell hoznunk ugyanebben a mappában egy ErrorResponses.cshtml fájlt, ami @model-ként egy List<ErrorCodeDescription> példányt fog kapni, amit utána úgy jelenítünk meg a weboldalon, ahogy csak szeretnénk.
Ez elsőre sok lépésnek tűnik, de valójában egészen logikus, érdemes megbarátkozni vele.
Technorati-címkék:
WebAPI,
help