परिचय: Java पर API का विकास
\n\nJava विकास की दुनिया स्थिर नहीं है। 10 साल पहले विकल्प स्पष्ट था: REST और JSON। आज, माइक्रोसर्विस आर्किटेक्चर या मोबाइल ऐप डिज़ाइन करते समय, डेवलपर को प्रोटोकॉल के एक पूरे समूह का सामना करना पड़ता है। REST, GraphQL, gRPC — इनमें से प्रत्येक स्वर्गीय सुख का वादा करता है, लेकिन वास्तविकता में प्रत्येक तकनीक के पीछे समझौते होते हैं।
\n\nइस लेख में हम दस्तावेज़ीकरण को दोबारा नहीं बताएंगे। हम एक वास्तविक समस्या लेंगे: हमें एक शैक्षिक प्लेटफ़ॉर्म के लिए API बनाना है (जैसे हमारा PythonLib, लेकिन Java पर)। हमारे पास पाठ्यक्रम, छात्र और सीखने की प्रगति है। और हम एक ही endpoint को तीन अलग-अलग तरीकों से लागू करने का प्रयास करेंगे।
\n\nचलिए समझते हैं कि कौन सा प्रोटोकॉल आपके कोड को तेज़ और आपके जीवन को आसान बनाएगा।
\n\nJava पर REST API: क्लासिक जो कभी खत्म नहीं होता
\n\nREST (Representational State Transfer) एक आर्किटेक्चरल शैली है, प्रोटोकॉल नहीं। Java में REST के लिए डी-फैक्टो मानक Spring Boot अपने एनोटेशन के साथ बन गया है। सरलता, स्पष्टता, विशाल समुदाय — यही कारण हैं जिनसे हम REST को पसंद करते हैं।
\n\nउदाहरण: पाठ्यक्रमों की सूची प्राप्त करना
\n\nमान लीजिए, हमें क्लाइंट को बुनियादी जानकारी के साथ सभी पाठ्यक्रमों की सूची देनी है:
\n\n@RestController\n@RequestMapping("/api/courses")\npublic class CourseController {\n\n @GetMapping\n public ResponseEntity<List<CourseDTO>> getAllCourses() {\n List<Course> courses = courseService.findAll();\n List<CourseDTO> dtos = courses.stream()\n .map(c -> new CourseDTO(c.getId(), c.getTitle(), c.getAuthor()))\n .toList();\n return ResponseEntity.ok(dtos);\n }\n}\n\nक्लाइंट को JSON मिलता है:
\n\n[\n {"id": 1, "title": "Java शुरुआती के लिए", "author": "इवान पेत्रोव"},\n {"id": 2, "title": "Spring Boot मास्टरक्लास", "author": "अन्ना स्मिर्नोवा"}\n]\n\nJava पर REST के लाभ:
\n- \n
- न्यूनतम प्रवेश सीमा — कोई भी Java डेवलपर Spring जानता है। \n
- HTTP हेडर (ETag, Cache-Control) के माध्यम से कैशिंग। \n
- उपकरणों की व्यापक समर्थन (Postman, Swagger, OpenAPI)। \n
नुकसान:
\n- \n
- over-fetching (अतिरिक्त डेटा) और under-fetching (डेटा की कमी, कई अनुरोध करने की आवश्यकता) की समस्या। \n
- कमज़ोर टाइपिंग — सब कुछ अनुबंध पर निर्भर करता है, जिसे आसानी से तोड़ा जा सकता है। \n
REST सार्वजनिक API के लिए आदर्श है, जब क्लाइंट तीसरे पक्ष हों और आपको अधिकतम अनुकूलता चाहिए। लेकिन अगर आपका क्लाइंट मोबाइल ऐप है, जो केवल वही प्राप्त करना चाहता है जो आवश्यक है, तो REST परेशान करने लगता है।
\n\nJava पर GraphQL: मुझे केवल वही दें जो मैं माँगता हूँ
\n\nGraphQL एक क्वेरी भाषा है, जिसे Facebook ने बनाया है। Java में इसे अक्सर graphql-java लाइब्रेरी या Spring के साथ एकीकरण — GraphQL Kickstart के माध्यम से लागू किया जाता है।
\n\nक्लाइंट खुद तय करता है कि उसे कौन से फ़ील्ड चाहिए। कोई over-fetching नहीं। एक अनुरोध — और आपको छात्र की प्रगति के साथ पाठ्यक्रम मिल जाते हैं।
\n\nउदाहरण: GraphQL schema और resolver
\n\nस्कीमा परिभाषित करें:
\n\ntype Course {\n id: ID!\n title: String!\n author: String!\n progress(studentId: ID!): Int\n}\n\ntype Query {\n courses: [Course!]!\n}\n\nJava पर रिज़ॉल्वर लिखें:
\n\n@Component\npublic class CourseResolver implements GraphQLQueryResolver {\n\n @Autowired\n private CourseService courseService;\n\n public List<Course> courses() {\n return courseService.findAll();\n }\n}\n\n@Component\npublic class CourseFieldResolver implements GraphQLResolver<Course> {\n\n @Autowired\n private ProgressService progressService;\n\n public Integer progress(Course course, Long studentId) {\n return progressService.getProgress(course.getId(), studentId);\n }\n}\n\nक्लाइंट से अनुरोध:
\n\nquery {\n courses {\n title\n