परिचय: REST बनाम GraphQL — Swift की नई दुनिया में पुरानी लड़ाई
\n\nएक समय था, Objective-C और सेलेक्टर-आधारित डिस्पैचिंग के युग में, REST और GraphQL के बीच चुनाव इतना तीव्र नहीं था। REST राजा था, और JSON उसका वफादार सहायक। लेकिन समय बदल गया। Swift मजबूत टाइप सिस्टम वाली भाषा बन गई, async/await, Codable और Apollo iOS जैसे शक्तिशाली फ्रेमवर्क आ गए। अब सवाल "REST या GraphQL?" का अर्थ बदल गया है: "मेरे Swift प्रोजेक्ट को क्या अधिक लाभ देगा?"
इस लेख में हम विकिपीडिया दोबारा नहीं लिखेंगे। हम एक शैक्षिक प्लेटफॉर्म (हाँ, वही PythonLib) के लिए एक वास्तविक iOS ऐप का उदाहरण लेंगे और देखेंगे कि Swift कोड में प्रत्येक दृष्टिकोण कैसे काम करता है। आप जानेंगे कि REST कब भी राज करता है, और GraphQL कब एक सच्चा उद्धारकर्ता है।
\n\nमुख्य बातें: REST, GraphQL से कैसे अलग है
\n\nउन लोगों के लिए जो अभी इस विषय में आ रहे हैं — बुनियादी अवधारणाएँ।
\n\n- \n
- REST — एक आर्किटेक्चरल शैली है जहाँ प्रत्येक संसाधन (उपयोगकर्ता, पाठ्यक्रम, पाठ) का अपना URL होता है। आपको एक निश्चित डेटा संरचना मिलती है जिसे सर्वर आपको देने का निर्णय लेता है। अक्सर, इसमें बहुत सारी अनावश्यक जानकारी होती है। \n
- GraphQL — एक क्वेरी भाषा है। आप स्वयं तय करते हैं कि कौन से फ़ील्ड चाहिए। एक प्रवेश बिंदु (
/graphql) और एक अनुरोध कई REST अनुरोधों को बदल सकता है। \n
कागज पर, GraphQL एक चांदी की गोली की तरह दिखता है। लेकिन Swift प्रोजेक्ट्स में कुछ बारीकियाँ हैं, जिन्हें हम अब व्यवहार में समझेंगे।
\n\nउदाहरण 1: उपयोगकर्ता प्रोफ़ाइल और उसके पाठ्यक्रम प्राप्त करना
\n\nSwift में REST दृष्टिकोण (URLSession + Codable)
\n\nमान लीजिए, हमारे पास एक क्लासिक REST API है। प्रोफ़ाइल और पाठ्यक्रमों की सूची दिखाने के लिए, दो अनुरोधों की आवश्यकता है:
\n\n// मॉडल\nstruct UserProfile: Codable {\n let id: Int\n let name: String\n let email: String\n let avatarURL: String\n}\n\nstruct Course: Codable {\n let id: Int\n let title: String\n let progress: Double\n}\n\n// नेटवर्क लेयर\nfunc fetchUserProfile(userId: Int) async throws -> UserProfile {\n let url = URL(string: "https://api.pythonlib.ru/users/\\(userId)")!\n let (data, _) = try await URLSession.shared.data(from: url)\n return try JSONDecoder().decode(UserProfile.self, from: data)\n}\n\nfunc fetchCourses(userId: Int) async throws -> [Course] {\n let url = URL(string: "https://api.pythonlib.ru/users/\\(userId)/courses")!\n let (data, _) = try await URLSession.shared.data(from: url)\n return try JSONDecoder().decode([Course].self, from: data)\n}\n\n// उपयोग\nlet profile = try await fetchUserProfile(userId: 42)\nlet courses = try await fetchCourses(userId: 42)\n\n\nसब कुछ सरल और पूर्वानुमानित है। लेकिन एक समस्या है: हमें प्रोफ़ाइल के सभी फ़ील्ड मिलते हैं, भले ही हमें केवल नाम और ईमेल चाहिए। और दो नेटवर्क अनुरोध भी। धीमे कनेक्शन पर यह दर्दनाक है।
\n\nSwift में GraphQL दृष्टिकोण (Apollo iOS)
\n\nअब वही काम, लेकिन GraphQL के माध्यम से। पहले .graphql फ़ाइल में क्वेरी परिभाषित करें:
query GetUserWithCourses($userId: ID!) {\n user(id: $userId) {\n id\n name\n email\n courses {\n id\n title\n progress\n }\n }\n}\n\n\nApollo स्वचालित रूप से टाइप किया गया Swift कोड उत्पन्न करता है। Xcode में यह इस तरह दिखता है:
\n\nimport Apollo\n\nlet apolloClient = ApolloClient(url: URL(string: "https://api.pythonlib.ru/graphql")!)\n\nfunc fetchUserWithCourses(userId: Int) async throws -> GetUserWithCoursesQuery.Data {\n return try await withCheckedThrowingContinuation { continuation in\n apolloClient.fetch(query: GetUserWithCoursesQuery(userId: userId)) { result in\n switch result {\n case .success(let graphQLResult):\n if let data = graphQLResult.data {\n continuation.resume(returning: data)\n } else if let errors = graphQLResult.errors {\n