C# में GraphQL vs REST: टाइटन्स की लड़ाई या काम के हिसाब से औजार?
\n\nनमस्ते दोस्तों! अगर आप C# में कोड लिखते हैं और API बनाते हैं, तो "REST या GraphQL?" का सवाल ज़रूर उठा होगा। यह बहस ऐसी ही है जैसे हथौड़ा बेहतर या पेचकस। दोनों अपनी जगह सही हैं, बस काम अलग है। इस आर्टिकल में हम किसी एक तकनीक का पक्ष नहीं लेंगे, बल्कि C# कोड उदाहरणों के साथ समझेंगे कि कब GraphQL बेहतर है और कब पुराना और भरोसेमंद REST राजा बना रहता है।
\n\nहम PythonLib की टीम हैं, और नाम में "Python" होने के बावजूद, हमें .NET और C# इकोसिस्टम से बहुत लगाव है। आज हम C# API की दुनिया में झांकेंगे और समझेंगे कि सही चुनाव कैसे करें। चलिए शुरू करते हैं!
\n\nC# डेवलपर के लिए REST और GraphQL की संक्षिप्त जानकारी
\n\nREST (Representational State Transfer) एक आर्किटेक्चरल स्टाइल है जिसे हम सब जानते और पसंद करते हैं। C# में आप शायद ASP.NET Core Web API का उपयोग करते हैं। आप कंट्रोलर और एंडपॉइंट बनाते हैं, और हर एंडपॉइंट एक फिक्स्ड डेटा स्ट्रक्चर लौटाता है। यूज़र चाहिए? /api/users/1 पर जाएं। उसके ऑर्डर चाहिए? /api/users/1/orders पर जाएं। सरल, अनुमानित, लेकिन अक्सर over-fetching (अनावश्यक डेटा मिलना) या under-fetching (कई रिक्वेस्ट करनी पड़ना) की समस्या होती है।
GraphQL एक क्वेरी लैंग्वेज है जिसे Facebook ने बनाया था। C# की दुनिया में इसे Hot Chocolate (सबसे लोकप्रिय) या GraphQL.NET लाइब्रेरी से इस्तेमाल किया जाता है। आपके पास एक ही एंडपॉइंट होता है (आमतौर पर /graphql), और क्लाइंट खुद तय करता है कि उसे कौन से फील्ड चाहिए। सिर्फ यूज़र का नाम और पहला ऑर्डर चाहिए? बिल्कुल! कोई over-fetching नहीं।
व्यावहारिक तुलना: C# कोड
\n\nचलिए थ्योरी से कोड की ओर बढ़ते हैं। मान लीजिए हमारे पास एक सरल मॉडल है: User और Order।
// डेटा मॉडल
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public string ProductName { get; set; }
public decimal Price { get; set; }
public DateTime CreatedAt { get; set; }
}
\n\nASP.NET Core पर REST API का उदाहरण
\n\n[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
[HttpGet("{id}")]
public async Task<ActionResult<User>> GetUser(int id)
{
// मान लें डेटा DB से आ रहा है
var user = await _dbContext.Users.FindAsync(id);
if (user == null) return NotFound();
return Ok(user); // सभी फील्ड लौटाता है: Id, Name, Email, Phone, Orders
}
}
\n\nसमस्या? अगर क्लाइंट को सिर्फ नाम और ईमेल चाहिए, तब भी उसे Phone और Orders मिलेंगे। और अगर ऑर्डर चाहिए, तो अलग से /api/users/1/orders पर रिक्वेस्ट करनी होगी।
Hot Chocolate पर GraphQL API का उदाहरण
\n\npublic class Query
{
public async Task<User> GetUser(int id, [Service] AppDbContext dbContext)
{
return await dbContext.Users.FindAsync(id);
}
}
// Program.cs में रजिस्ट्रेशन
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>();
\n\nअब क्लाइंट सिर्फ वही मांग सकता है जो उसे चाहिए:
\n\n// GraphQL क्वेरी
{
user(id: 1) {
name
email
orders {
productName
price
}
}
}
\n\nजवाब में सिर्फ name, email और orders ऐरे मिलेगा जिसमें productName और price होंगे। कोई अनावश्यक डेटा नहीं। कमाल है!
C# में REST कब जीतता है (और यह सामान्य है)
\n\n1. सरलता और कैशिंग। REST API को HTTP लेवल पर कैश करना आसान है (CDN, प्रॉक्सी)। /api/products पर GET रिक्वेस्ट को कैश किया जा सकता है, और सब