عنوان:

‫تولید API Documentation مدرن با Scalar در ASP.NET Core


نویسنده: محمد شریفی
تاریخ: ۱۴۰۴/۰۹/۱۸ ۰۹:۰۰
آدرس: www.dntips.ir
در این مقاله قصد داریم نحوه استفاده از پکیج Scalar.AspNetCore در ASP.NET Core را بررسی کنیم تا بتوانیم به راحتی مستندات زیبا و حرفه‌ای API خود را بر اساس OpenAPI ایجاد و نمایش دهیم. همچنین روش‌های پیکربندی مسیرها، مدیریت چند مستند OpenAPI، تنظیمات احراز هویت و سفارشی‌سازی ظاهر و رفتار مستندات را به صورت عملی توضیح خواهیم داد.

۱. راه‌اندازی اولیه
نصب پکیج
dotnet add package Scalar.AspNetCore
این دستور پکیج Scalar.AspNetCore را به پروژه شما اضافه می‌کند تا بتوانید از امکانات آن برای ساخت مستندات API استفاده کنید.

اضافه کردن فضای نام
using Scalar.AspNetCore;

۲. تنظیم برنامه
برای Microsoft.AspNetCore.OpenApi
builder.Services.AddOpenApi();
if (app.Environment.IsDevelopment())
{
    app.MapOpenApi();
    app.MapScalarApiReference();
}
AddOpenApi: سرویس OpenAPI را به پروژه اضافه می‌کند.
MapOpenApi: مسیر OpenAPI را در محیط توسعه فعال می‌کند.
MapScalarApiReference: مسیر scalar/ را برای مشاهده مستندات API فراهم می‌کند.

برای Swashbuckle.AspNetCore.SwaggerGen
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

if (app.Environment.IsDevelopment())
{
    app.MapSwagger("/openapi/{documentName}.json");
    app.MapScalarApiReference();
}
AddEndpointsApiExplorer: برای بررسی endpointها استفاده می‌شود.
AddSwaggerGen: مستندات Swagger را ایجاد می‌کند.
MapSwagger: مسیر JSON مستندات را مشخص می‌کند.
MapScalarApiReference: همان مسیر scalar/ را فعال می‌کند.

برای NSwag.AspNetCore
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddOpenApiDocument();

if (app.Environment.IsDevelopment())
{
    app.UseOpenApi(options =>
    {
        options.Path = "/openapi/{documentName}.json";
    });
    app.MapScalarApiReference();
}
AddOpenApiDocument: مستندات NSwag را تولید می‌کند.
UseOpenApi: مسیر JSON مستندات را تعیین می‌کند.
MapScalarApiReference: مسیر /scalar را فعال می‌کند.

برای FastEndpoints
builder.Services.SwaggerDocument();

if (app.Environment.IsDevelopment())
{
    app.UseSwaggerGen(options =>
    {
        options.Path = "/openapi/{documentName}.json";
    });
    app.MapScalarApiReference();
}
SwaggerDocument: مستندات FastEndpoints را تولید می‌کند.
مسیر مستندات JSON و مسیر scalar/ تنظیم می‌شوند.

۳. استفاده از MapScalarApiReference
app.MapScalarApiReference();
این خط مسیر پیش‌فرض scalar/ را ایجاد می‌کند تا مستندات API قابل مشاهده باشند.

تغییر مسیر
app.MapScalarApiReference("/api-docs");
app.MapScalarApiReference("/docs");
با این خطوط می‌توانید مسیر نمایش مستندات را تغییر دهید.

با تنظیمات دلخواه
app.MapScalarApiReference(options =>
{
    options.WithTitle("My API");
});
این روش امکان تنظیم عنوان دلخواه برای مستندات را فراهم می‌کند.

مسیر سفارشی + تنظیمات
app.MapScalarApiReference("/docs", options =>
{
    options.WithTitle("My API Documentation");
});
هم مسیر و هم عنوان مستندات را می‌توان به صورت همزمان مشخص کرد.

تنظیمات داینامیک با HttpContext
app.MapScalarApiReference((options, httpContext) =>
{
    var isAdmin = httpContext.User.IsInRole("Admin");
    options.WithTitle(isAdmin ? "Admin API" : "Public API");
});

// مسیر سفارشی با HttpContext
app.MapScalarApiReference("/docs", (options, httpContext) =>
{
    options.WithTitle($"API برای {httpContext.User.Identity?.Name}");
});
با دسترسی به HttpContext می‌توان عنوان مستندات را به صورت داینامیک بر اساس نقش کاربر یا نام او تغییر داد.

۴. پیکربندی ظاهر و رفتار Scalar
app.MapScalarApiReference(options =>
{
    options.WithTitle("E-Commerce API")
           .WithClassicLayout()             
           .ForceDarkMode()                
           .HideSearch()                    
           .ShowOperationId()              
           .ExpandAllTags()                 
           .SortTagsAlphabetically()        
           .SortOperationsByMethod()      
           .PreserveSchemaPropertyOrder()  
           .WithProxy("https://api-gateway.company.com")
           .AddServer("https://api.company.com", "Production")
           .AddServer("https://staging-api.company.com", "Staging");
});
این بخش تمام ویژگی‌های ظاهری و رفتار Scalar را به صورت Fluent API تنظیم می‌کند:
  • WithTitle: تعیین عنوان مستندات که در بالای صفحه و Title مرورگر نمایش داده می‌شود.
  • WithClassicLayout: فعال‌کردن ظاهر کلاسیک Scalar که ساختاری مشابه Swagger UI دارد و منوی سمت چپ را نمایش می‌دهد.
  • ForceDarkMode: اجبار UI به نمایش در حالت Dark Mode بدون توجه به تنظیمات سیستم یا مرورگر.
  • HideSearch: مخفی کردن قابلیت جستجو در UI مستندات برای کاهش شلوغی و ساده‌تر شدن نمایش.
  • ShowOperationId: نمایش مقدار operationId برای هر endpoint که برای Code Generation و Debugging بسیار کاربردی است.
  • ExpandAllTags: باز بودن تمام گروه‌ها (Tags) به صورت پیش‌فرض هنگام لود صفحه تا همه Endpointها بدون کلیک‌کردن قابل مشاهده باشند.
  • SortTagsAlphabetically: مرتب‌سازی دسته‌بندی‌های API بر اساس حروف الفبا جهت افزایش نظم و دسترسی بهتر.
  • SortOperationsByMethod: مرتب‌سازی عملیات داخل هر دسته‌بندی بر اساس HTTP Method مانند: GET، POST، PUT، DELETE و غیره.
  • PreserveSchemaPropertyOrder: حفظ ترتیب فیلدهای Schema دقیقاً مطابق ترتیب تعریف‌شده در کلاس‌های C# و جلوگیری از ترتیب‌دهی خودکار.
  • WithProxy: ارسال درخواست‌های تستی UI از طریق API Gateway برای حل مشکل CORS و یکپارچگی ارتباطات.
  • AddServer: افزودن محیط Production به لیست سرورها تا کاربر بتواند درخواست را مستقیماً به این محیط ارسال کند یا افزودن محیط Staging برای تست، QA و بررسی قبل از انتشار نهایی.

۵. مسیر مستندات OpenAPI
app.MapScalarApiReference(options =>
{
    options.WithOpenApiRoutePattern("/api-spec/{documentName}.json");
});
مسیر مستندات OpenAPI را مشخص می‌کند. {documentName} با نام مستند جایگزین می‌شود.

app.MapScalarApiReference(options =>
{
    options.WithOpenApiRoutePattern("https://api.example.com/openapi/{documentName}.json");
});
استفاده از URL خارجی برای دریافت مستندات.

۶. استفاده از چند مستند OpenAPI
اضافه کردن یک مستند
app.MapScalarApiReference(options => options.AddDocument("v1"));
اضافه کردن یک مستند به صورت ساده، با نام v1.

app.MapScalarApiReference(options => options.AddDocument("v1", "Production API"));
اضافه کردن مستند با عنوان دلخواه.

اضافه کردن چند مستند
app.MapScalarApiReference(options =>
{
    options.AddDocument("v1", "Production API", "api/v1/openapi.json")
           .AddDocument("v2-beta", "Beta API", "api/v2-beta/openapi.json", isDefault: true)
           .AddDocument("internal", "Internal API", "internal/openapi.json");
});
می‌توان چند مستند را اضافه کرد و یکی از آن‌ها را به عنوان پیش‌فرض انتخاب نمود.

۷. احراز هویت
API Key
app.MapScalarApiReference(options => options
    .AddPreferredSecuritySchemes("ApiKey")
    .AddApiKeyAuthentication("ApiKey", apiKey =>
    {
        apiKey.Value = "sk-demo-key-12345";
    }));
پیش‌تنظیم کلید API برای استفاده در مستندات و تست API.

Bearer Token
app.MapScalarApiReference(options => options
    .AddPreferredSecuritySchemes("BearerAuth")
    .AddHttpAuthentication("BearerAuth", auth =>
    {
        auth.Token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
    }));
تنظیم توکن Bearer برای تست endpointها.

Basic Auth
app.MapScalarApiReference(options => options
    .AddPreferredSecuritySchemes("BasicAuth")
    .AddHttpAuthentication("BasicAuth", auth =>
    {
        auth.Username = "demo-user";
        auth.Password = "demo-password";
    }));
پیش‌تنظیم Basic Authentication برای تست API.

OAuth2 (Authorization Code Flow)
app.MapScalarApiReference(options => options
    .AddPreferredSecuritySchemes("OAuth2")
    .AddAuthorizationCodeFlow("OAuth2", flow =>
    {
        flow.ClientId = "scalar-demo-client";
        flow.ClientSecret = "scalar-demo-secret";
        flow.Pkce = Pkce.Sha256;
        flow.SelectedScopes = ["read", "write", "admin"];
    }));
پیش‌تنظیم OAuth2 برای Authorization Code Flow با مقادیر نمونه.

۸. سفارشی‌سازی بیشتر
HTTP Client پیش‌فرض
app.MapScalarApiReference(options =>
{
    options.WithDefaultHttpClient(ScalarTarget.CSharp, ScalarClient.HttpClient);
});
تعیین HTTP Client پیش‌فرض برای نمونه کدها.

تغییر مسیر بارگذاری Assets
app.MapScalarApiReference(options =>
{
    options.WithBundleUrl("https://cdn.jsdelivr.net/npm/@scalar/api-reference");
});
تغییر مسیر فایل‌های CSS و JS استفاده شده در مستندات.

پیکربندی جاوااسکریپت دلخواه
app.MapScalarApiReference(options =>
{
    options.WithJavaScriptConfiguration("/scalar/config.js");
});
امکان افزودن اسکریپت دلخواه برای تغییر رفتار Scalar.

۹. Dependency Injection
builder.Services.Configure<ScalarOptions>(options => options.Title = "My API");
تنظیمات Scalar را از طریق DI اعمال می‌کند.

۱۰. نکات تکمیلی
app.MapScalarApiReference().AllowAnonymous();
امکان دسترسی بدون احراز هویت به مستندات.

Scalar برای ASP.NET Core با سیاست رسمی مایکروسافت سازگار است و گزینه‌های پیکربندی کامل در ScalarOptions و ScalarOptionsExtensions موجود است.