.NET CLI का उपयोग करके प्रारंभिक प्रोजेक्ट सेटअप से लेकर मिडलवेयर, कंट्रोलर और सेवाओं को कॉन्फ़िगर करने तक, एक मजबूत API बनाने के लिए हर चरण को जानें। स्केलेबल, कुशल वेब एप्लिकेशन बनाने के लिए निर्भरता इंजेक्शन, एसिंक्रोनस क्रियाओं और अपवादों को संभालने के लिए सर्वोत्तम अभ्यासों की खोज करें।
एक नया वेब एपीआई प्रोजेक्ट बनाने के लिए .NET CLI का उपयोग करें। यह स्टार्टअप के लिए Program.cs और उदाहरण के तौर पर WeatherForecast कंट्रोलर सहित एक बुनियादी प्रोजेक्ट संरचना सेट करता है।
dotnet new webapi -n MyWebApi
.NET 8 न्यूनतम API की प्रवृत्ति को जारी रखता है, जिससे आप सीधे Program.cs फ़ाइल में सरलीकृत और संक्षिप्त तरीके से सेवाओं और समापन बिंदुओं को कॉन्फ़िगर कर सकते हैं।
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/", () => "Hello, World!"); app.Run();
नियंत्रक आने वाले HTTP अनुरोधों को संभालते हैं और क्लाइंट को जवाब देते हैं। उन्हें ControllerBase से विरासत में प्राप्त करके और [ApiController] के साथ एनोटेट करके परिभाषित किया जाता है।
[ApiController] [Route("[controller]")] public class MyController : ControllerBase { [HttpGet] public IActionResult Get() => Ok("Hello from MyController"); }
.NET Core का बिल्ट-इन डिपेंडेंसी इंजेक्शन (DI) डिपेंडेंसी को मैनेज करना आसान बनाता है। आप अपने कंट्रोलर में उनके कंस्ट्रक्टर के ज़रिए सेवाएँ इंजेक्ट कर सकते हैं।
public class MyService { public string GetMessage() => "Injected message"; } public class MyController : ControllerBase { private readonly MyService _myService; public MyController(MyService myService) { _myService = myService; } [HttpGet] public IActionResult Get() => Ok(_myService.GetMessage()); }
सेवाएँ (जैसे डेटाबेस संदर्भ, कस्टम सेवाएँ, आदि) Program.cs फ़ाइल में कॉन्फ़िगर की जाती हैं, जिससे वे आपके संपूर्ण अनुप्रयोग में निर्भरता इंजेक्शन के लिए उपलब्ध हो जाती हैं।
builder.Services.AddScoped<MyService>();
.NET वातावरण-विशिष्ट कॉन्फ़िगरेशन फ़ाइलों (appsettings.json, appsettings.Development.json, आदि) का समर्थन करता है, जो अनुप्रयोग के वातावरण के आधार पर विभिन्न सेटिंग्स की अनुमति देता है।
// appsettings.Development.json { "Logging": { "LogLevel": { "Default": "Debug" } } }
मिडलवेयर घटक एक पाइपलाइन बनाते हैं जो अनुरोधों और प्रतिक्रियाओं को संभालता है। लॉगिंग या त्रुटि प्रबंधन जैसी क्रॉस-कटिंग चिंताओं के लिए कस्टम मिडलवेयर बनाया जा सकता है।
app.Use(async (context, next) => { // Custom logic before passing to the next middleware await next(); // Custom logic after executing the next middleware });
.NET वेब API में रूटिंग नियंत्रकों और क्रिया विधियों पर विशेषता रूटिंग के माध्यम से प्राप्त की जाती है। यह URL को सीधे नियंत्रक क्रियाओं पर मैप करने की अनुमति देता है।
[HttpGet("myaction/{id}")] public IActionResult GetAction(int id) => Ok($"Action with ID = {id}");
मॉडल बाइंडिंग HTTP अनुरोधों से डेटा को स्वचालित रूप से एक्शन मेथड पैरामीटर्स में मैप करता है। यह JSON बॉडी और क्वेरी स्ट्रिंग पैरामीटर्स सहित जटिल प्रकारों का समर्थन करता है।
public class MyModel { public int Id { get; set; } public string Name { get; set; } } [HttpPost] public IActionResult PostAction([FromBody] MyModel model) => Ok(model);
डेटा एनोटेशन का उपयोग मॉडल डेटा को मान्य करने के लिए किया जा सकता है। [ApiController] विशेषता स्वचालित रूप से सत्यापन को लागू करती है, यदि मॉडल अमान्य है तो 400 के साथ प्रतिक्रिया करती है।
public class MyModel { [Required] public int Id { get; set; } [StringLength(100)] public string Name { get; set; } }
एसिंक्रोनस क्रियाएँ I/O संचालन के पूरा होने की प्रतीक्षा करते समय थ्रेड्स को मुक्त करके स्केलेबिलिटी में सुधार करती हैं। async कीवर्ड का उपयोग करें, और Task या Task<IActionResult> लौटाएँ।
[HttpGet("{id}")] public async Task<IActionResult> GetAsync(int id) { var result = await _service.GetByIdAsync(id); return Ok(result); }
वैश्विक अपवाद प्रबंधन, केंद्रीकृत त्रुटि प्रसंस्करण, लॉगिंग और अनहैंडल किए गए अपवादों पर मानकीकृत API प्रतिक्रियाओं की अनुमति देता है।
app.UseExceptionHandler(a => a.Run(async context => { var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>(); var exception = exceptionHandlerPathFeature.Error; // Log the exception, generate a custom response, etc. context.Response.StatusCode = 500; await context.Response.WriteAsJsonAsync(new { Error = "An unexpected error occurred" }); }));
API वर्शनिंग समय के साथ API में होने वाले बदलावों को प्रबंधित करने में मदद करती है। .NET प्लेटफ़ॉर्म क्वेरी स्ट्रिंग, URL पथ या अनुरोध हेडर के माध्यम से वर्शनिंग का समर्थन करता है।
builder.Services.AddApiVersioning(options => { options.AssumeDefaultVersionWhenUnspecified = true; options.DefaultApiVersion = new ApiVersion(1, 0); options.ReportApiVersions = true; });
सामग्री वार्ता, API को अनुरोध में स्वीकार हेडर के आधार पर प्रतिक्रिया के विभिन्न प्रारूपों को प्रस्तुत करने की अनुमति देती है, जिससे JSON, XML आदि प्रारूपों के लिए समर्थन सक्षम होता है।
builder.Services.AddControllers() .AddXmlDataContractSerializerFormatters();
JSON सीरिएलाइजर सेटिंग्स को कॉन्फ़िगर करके JSON प्रतिक्रिया स्वरूपण को अनुकूलित करें, जैसे कि कैमलकेस नामकरण या शून्य मानों को अनदेखा करना।
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.IgnoreNullValues = true; });
क्रॉस-ऑरिजिन रिसोर्स शेयरिंग (CORS) आपके API को अलग-अलग डोमेन पर होस्ट किए गए वेब एप्लिकेशन से कॉल करने की अनुमति देता है। अपनी आवश्यकताओं के अनुसार CORS नीति को कॉन्फ़िगर करें।
builder.Services.AddCors(options => { options.AddPolicy("AllowSpecificOrigin", builder => builder.WithOrigins("http://example.com")); }); app.UseCors("AllowSpecificOrigin");
प्रमाणीकरण सक्षम करके अपने API को सुरक्षित करें, जो अनुरोध करने वाले उपयोगकर्ताओं या सेवाओं की पहचान सत्यापित करता है।
builder.Services.AddAuthentication("Bearer") .AddJwtBearer(options => { options.Authority = "https://your-auth-server"; options.Audience = "your-api"; });
प्रमाणीकरण के बाद, प्राधिकरण यह निर्धारित करता है कि प्रमाणीकृत उपयोगकर्ता के पास कोई कार्य करने या किसी संसाधन तक पहुंचने की अनुमति है या नहीं।
[Authorize] public class SecureController : ControllerBase { // Action methods here }
स्वैगर (ओपनएपीआई) आपके एपीआई के लिए इंटरैक्टिव दस्तावेज उपलब्ध कराता है, जिससे डेवलपर्स इसे आसानी से समझ और उपयोग कर सकते हैं।
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); app.UseSwagger(); app.UseSwaggerUI();
.NET Core एक अंतर्निहित लॉगिंग फ्रेमवर्क प्रदान करता है जो विभिन्न आउटपुट (कंसोल, डिबग विंडो, बाहरी सेवाएं, आदि) पर संदेशों को लॉग कर सकता है।
logger.LogInformation("This is an informational message"); app.Use(async (context, next) => { logger.LogError("This is an error message before the next middleware"); await next.Invoke(); // Log after calling the next middleware });
एंटिटी फ्रेमवर्क कोर एक ORM है जिसका उपयोग .NET अनुप्रयोगों में डेटा एक्सेस के लिए किया जाता है। यह आपको दृढ़ता से टाइप किए गए ऑब्जेक्ट का उपयोग करके डेटा को क्वेरी और हेरफेर करने की अनुमति देता है।
public class MyDbContext : DbContext { public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) {} public DbSet<MyModel> MyModels { get; set; } }
माइग्रेशन आपको अपने डेटा मॉडल में परिवर्तनों को ट्रैक करके अपने डेटाबेस स्कीमा पर संस्करण नियंत्रण लागू करने की अनुमति देता है।
dotnet ef migrations add InitialCreate dotnet ef database update
रिपॉजिटरी पैटर्न डेटा परत को अमूर्त बनाता है, जिससे आपका एप्लिकेशन अधिक मॉड्यूलर हो जाता है और उसका रखरखाव आसान हो जाता है।
public interface IRepository<T> { Task<IEnumerable<T>> GetAllAsync(); Task<T> GetByIdAsync(int id); // Other methods... } public class MyRepository<T> : IRepository<T> where T : class { private readonly MyDbContext _context; public MyRepository(MyDbContext context) { _context = context; } // Implement methods... }
यूनिट परीक्षण कोड की अलग-अलग इकाइयों का अलग-अलग परीक्षण करके यह सुनिश्चित करता है कि आपका वेब एपीआई सही ढंग से कार्य कर रहा है।
public class MyControllerTests { [Fact] public async Task Get_ReturnsExpectedValue() { // Arrange var serviceMock = new Mock<IMyService>(); serviceMock.Setup(service => service.GetAsync()).ReturnsAsync("test"); var controller = new MyController(serviceMock.Object); // Act var result = await controller.Get(); // Assert Assert.Equal("test", result.Value); } }
.NET वेब एपीआई फ्रंट-एंड एप्लिकेशन के लिए बैकएंड के रूप में काम कर सकता है, तथा RESTful सेवाएं प्रदान कर सकता है।
fetch('https://localhost:5001/mycontroller') .then(response => response.json()) .then(data => console.log(data));
स्वास्थ्य जांच आपके एप्लिकेशन और इसकी निर्भरताओं की स्थिति की निगरानी करने का एक तरीका प्रदान करती है, जो माइक्रोसर्विस आर्किटेक्चर के लिए उपयोगी है।
builder.Services.AddHealthChecks(); app.MapHealthChecks("/health");
सिग्नलआर वास्तविक समय वेब कार्यक्षमता को सक्षम बनाता है, जिससे सर्वर-साइड कोड क्लाइंट-साइड वेब अनुप्रयोगों को अतुल्यकालिक सूचनाएं भेजने में सक्षम होता है।
public class MyHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } }
प्रतिक्रिया कैशिंग, पहले से अनुरोधित संसाधनों की एक प्रतिलिपि संग्रहीत करके सर्वर द्वारा संभाले जाने वाले अनुरोधों की संख्या को कम कर देता है।
[HttpGet("{id}")] [ResponseCache(Duration = 60)] public IActionResult GetById(int id) { // Retrieve and return your resource }
.NET वेब API के साथ फ्रंट-एंड अनुप्रयोगों को समर्थन देने के लिए स्थैतिक फ़ाइलें (HTML, CSS, JavaScript, आदि) प्रदान करना आवश्यक है।
app.UseStaticFiles(); // Enable static file serving
विकल्प पैटर्न संबंधित सेटिंग्स के समूहों का प्रतिनिधित्व करने के लिए कक्षाओं का उपयोग करता है। IOptions<T> का उपयोग करके, आप अपने एप्लिकेशन में कहीं भी इन सेटिंग्स तक पहुँच सकते हैं।
public class MySettings { public string Setting1 { get; set; } // Other settings } builder.Services.Configure<MySettings>(builder.Configuration.GetSection("MySettings")); public class MyService { private readonly MySettings _settings; public MyService(IOptions<MySettings> settings) { _settings = settings.Value; } // Use _settings.Setting1 }
मिडलवेयर एक ऐसा सॉफ़्टवेयर है जिसे अनुरोधों और प्रतिक्रियाओं को संभालने के लिए एप्लिकेशन पाइपलाइन में इकट्ठा किया जाता है। विशिष्ट कार्यों को करने के लिए कस्टम मिडलवेयर बनाया जा सकता है।
public class MyCustomMiddleware { private readonly RequestDelegate _next; public MyCustomMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext httpContext) { // Pre-processing logic here await _next(httpContext); // Call the next middleware in the pipeline // Post-processing logic here } } // Extension method for easy middleware registration public static class MyCustomMiddlewareExtensions { public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<MyCustomMiddleware>(); } }
दर सीमित करना आपके API को अति प्रयोग से बचाता है, यह सीमित करके कि एक उपयोगकर्ता एक निश्चित समय सीमा के भीतर कितनी बार अनुरोध कर सकता है।
// Assume using a third-party library like AspNetCoreRateLimit builder.Services.AddInMemoryRateLimiting(); builder.Services.Configure<IpRateLimitOptions>(options => { options.GeneralRules = new List<RateLimitRule> { new RateLimitRule { Endpoint = "*", Limit = 100, Period = "1h" } }; });
API कुंजियाँ API कॉल को प्रमाणित और अधिकृत करने का एक सरल तरीका है। उन्हें क्लाइंट से सर्वर तक क्वेरी स्ट्रिंग या हेडर में भेजा जाता है।
public class ApiKeyMiddleware { private readonly RequestDelegate _next; private const string APIKEYNAME = "x-api-key"; public ApiKeyMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { if (!context.Request.Headers.TryGetValue(APIKEYNAME, out var extractedApiKey)) { context.Response.StatusCode = 401; await context.Response.WriteAsync("API Key was not provided."); return; } // Validate the extracted API Key here... await _next(context); } }
आउटपुट कैशिंग आपको किसी अनुरोध के जवाब को संग्रहीत करने की अनुमति देता है। बाद के अनुरोधों को कैश से पूरा किया जा सकता है, जिससे प्रदर्शन में काफी सुधार होता है।
[HttpGet] [ResponseCache(Duration = 120, Location = ResponseCacheLocation.Client, NoStore = false)] public IActionResult Get() { // Your logic here }
पृष्ठभूमि कार्य, उपयोगकर्ता के अनुरोधों से स्वतंत्र होकर पृष्ठभूमि में संचालन को सक्षम करते हैं, जैसे ईमेल भेजना या लंबे समय से चल रहे कार्यों को संसाधित करना।
public class MyBackgroundService : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { // Your background task logic here await Task.Delay(TimeSpan.FromHours(1), stoppingToken); } } }
वेबसॉकेट एकल, दीर्घकालिक कनेक्शन पर पूर्ण-द्वैध संचार चैनल प्रदान करते हैं, जो वास्तविक समय अनुप्रयोगों के लिए आदर्श है।
app.UseWebSockets(); app.Use(async (context, next) => { if (context.WebSockets.IsWebSocketRequest) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); // Handle the WebSocket request here } else { await next(); } });
अनुरोध स्थानीयकरण, अनुरोध की जानकारी के आधार पर विभिन्न संस्कृतियों और भाषाओं के लिए सामग्री को स्थानीयकृत करने का एक तरीका प्रदान करता है।
var supportedCultures = new[] { "en-US", "fr-FR" }; var localizationOptions = new RequestLocalizationOptions() .SetDefaultCulture(supportedCultures[0]) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); app.UseRequestLocalization(localizationOptions);
ग्राफ़क्यूएल एपीआई के लिए एक क्वेरी भाषा है। .NET वेब एपीआई को ग्राफ़क्यूएल के साथ एकीकृत करने से अधिक कुशल डेटा पुनर्प्राप्ति की अनुमति मिलती है।
// Assume using a library like HotChocolate builder.Services .AddGraphQLServer() .AddQueryType<Query>(); app.MapGraphQL();
मॉनिटरिंग और टेलीमेट्री में आपके एप्लिकेशन के प्रदर्शन और उपयोग के बारे में डेटा एकत्र करना, उसका विश्लेषण करना और उस पर कार्रवाई करना शामिल है।
// Assume using Application Insights builder.Services.AddApplicationInsightsTelemetry("YOUR_INSTRUMENTATION_KEY");
सिग्नलआर एक लाइब्रेरी है जो ऐप्स में रीयल-टाइम वेब कार्यक्षमता जोड़ने को सरल बनाती है। रीयल-टाइम वेब कार्यक्षमता सर्वर कोड द्वारा कनेक्टेड क्लाइंट को तुरंत कंटेंट पुश करने की क्षमता है, जिससे सर्वर को क्लाइंट द्वारा नए डेटा का अनुरोध करने की प्रतीक्षा करने की आवश्यकता नहीं होती है। सिग्नलआर चैट एप्लिकेशन, रीयल-टाइम डैशबोर्ड और अधिक इंटरैक्टिव वेब एप्लिकेशन विकसित करने के लिए एकदम सही है।
public class ChatHub : Hub { public async Task SendMessage(string user, string message) { // Call the broadcastMessage method to update clients. await Clients.All.SendAsync("broadcastMessage", user, message); } } // Startup or Program.cs app.MapHub<ChatHub>("/chathub");
Program.cs में एकीकरण:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // Other configurations... app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/chathub"); }); }
एंटिटी फ्रेमवर्क कोर, एंटिटीज के बीच जटिल संबंधों के मानचित्रण की अनुमति देता है, जैसे एक-से-एक, एक-से-अनेक, और अनेक-से-अनेक।
public class Author { public int AuthorId { get; set; } public string Name { get; set; } public ICollection<Book> Books { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } public int AuthorId { get; set; } public Author Author { get; set; } }
कस्टम सत्यापन विशेषताएँ आपको डेटा मॉडल के लिए अपने सत्यापन तर्क को परिभाषित करने की अनुमति देती हैं, जो अंतर्निहित सत्यापन विशेषताओं का विस्तार करती हैं।
public class MyCustomValidationAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // Your custom validation logic here if (value is int intValue && intValue > 0) { return ValidationResult.Success; } return new ValidationResult("Value must be positive"); } } public class MyModel { [MyCustomValidationAttribute] public int MyProperty { get; set; } }
.NET का विकल्प पैटर्न जटिल कॉन्फ़िगरेशन परिदृश्यों का समर्थन करता है, जिसमें नेस्टेड ऑब्जेक्ट्स, सूचियाँ और सत्यापन शामिल हैं।
public class MyOptions { public MyNestedOptions Nested { get; set; } public List<string> Items { get; set; } } public class MyNestedOptions { public string Key { get; set; } } // In Program.cs or Startup.cs builder.Services.Configure<MyOptions>(builder.Configuration.GetSection("MyOptions"));
किसी एप्लिकेशन की निगरानी और प्रोफाइलिंग से बाधाओं और अकुशलताओं की पहचान हो सकती है, जो प्रदर्शन को अनुकूलित करने के लिए आवश्यक है।
app.UseMiniProfiler();
अपने स्वैगर यूआई में XML टिप्पणियों को एकीकृत करके अपने API दस्तावेज़न को बेहतर बनाएं, जिससे आपके API का उपयोग करने वाले डेवलपर्स को बेहतर अनुभव प्राप्त हो।
builder.Services.AddSwaggerGen(c => { var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); });
वैश्वीकरण और स्थानीयकरण आपके एप्लिकेशन को कई भाषाओं और संस्कृतियों का समर्थन करने की अनुमति देता है, जिससे यह वैश्विक दर्शकों के लिए सुलभ हो जाता है।
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
विभिन्न HTTP हेडर्स जोड़कर अपने वेब एप्लिकेशन की सुरक्षा में सुधार करने से आम हमलों और कमजोरियों से सुरक्षा मिल सकती है।
app.UseHsts(); app.UseXContentTypeOptions(); app.UseReferrerPolicy(opts => opts.NoReferrer()); app.UseXXssProtection(options => options.EnabledWithBlockMode()); app.UseXfo(options => options.Deny());
फ़ीचर फ़्लैग आपको नया कोड तैनात किए बिना अपने एप्लिकेशन की सुविधाओं को चालू और बंद करने की अनुमति देते हैं, जिससे परीक्षण और रोलआउट आसान हो जाता है।
// Using a library like Microsoft.FeatureManagement builder.Services.AddFeatureManagement();
Blazor आपको जावास्क्रिप्ट के बजाय C# का उपयोग करके इंटरैक्टिव वेब UI बनाने की अनुमति देता है। Blazor को Web API के साथ एकीकृत करने से एक सहज पूर्ण-स्टैक विकास अनुभव मिलता है।
// In a Blazor Server app @code { private IEnumerable<WeatherForecast> forecasts; protected override async Task OnInitializedAsync() { forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast"); } }
प्रतिक्रिया संपीड़न आपके API प्रतिक्रियाओं के आकार को कम कर सकता है, जिससे धीमे नेटवर्क पर क्लाइंट के लिए लोड समय में सुधार हो सकता है।
builder.Services.AddResponseCompression(options => { options.Providers.Add<GzipCompressionProvider>(); options.EnableForHttps = true; }); app.UseResponseCompression();
C# समुदाय का हिस्सा बनने के लिए धन्यवाद! जाने से पहले:
हमारा अनुसरण करें: X | LinkedIn | Dev.to | Hashnode | न्यूज़लैटर | Tumblr
हमारे अन्य प्लेटफ़ॉर्म पर जाएँ: GitHub | Instagram | Tiktok | Quora | Daily.dev
यहां भी प्रकाशित