परिचय: Go REST API के लिए आदर्श विकल्प क्यों है
\nGo (या Golang) Google द्वारा विकसित एक कंपाइल की जाने वाली प्रोग्रामिंग भाषा है, जो C++ के प्रदर्शन को Python की सरलता के साथ जोड़ती है। यदि आप एक तेज़, विश्वसनीय और आसानी से बनाए रखने योग्य REST API बनाना चाहते हैं, तो Go सबसे अच्छे विकल्पों में से एक है। इस लेख में, हम 30 मिनट में Go पर एक पूर्ण REST API लिखेंगे जो रिकॉर्ड बना सकता है, पढ़ सकता है, अपडेट कर सकता है और हटा सकता है (CRUD)। कोई जटिल फ्रेमवर्क नहीं - केवल मानक लाइब्रेरी net/http और थोड़ा कोड।
लेख के अंत तक, आपके पास एक तैयार HTTP सर्वर होगा जो JSON प्रारूप में अनुरोधों का जवाब देता है और बिना किसी बाहरी निर्भरता के काम करता है। चलिए शुरू करते हैं!
\n\nचरण 1: प्रोजेक्ट सेटअप और संरचना
\nशुरू करने के लिए, सुनिश्चित करें कि आपके पास Go (संस्करण 1.16+) स्थापित है। प्रोजेक्ट के लिए एक नई निर्देशिका बनाएं और मॉड्यूल को इनिशियलाइज़ करें:
\nmkdir go-rest-api\ncd go-rest-api\ngo mod init go-rest-api\nप्रोजेक्ट की संरचना सरल होगी - एक फ़ाइल main.go। हम सारा कोड इसमें रखेंगे ताकि उदाहरण जटिल न हो। वास्तविक प्रोजेक्ट में, आप निश्चित रूप से कोड को पैकेजों में विभाजित करेंगे, लेकिन सीखने के लिए यह आदर्श विकल्प है।
चरण 2: डेटा संरचना और वैश्विक भंडारण को परिभाषित करें
\nहमारा API पुस्तकों की सूची का प्रबंधन करेगा। आइए एक Book संरचना और मेमोरी में डेटा संग्रहीत करने के लिए एक सरल स्लाइस बनाएं (डेटाबेस के बजाय)।
package main\n\nimport (\n "encoding/json"\n "log"\n "net/http"\n "strconv"\n "strings"\n)\n\ntype Book struct {\n ID int `json:"id"`\n Title string `json:"title"`\n Author string `json:"author"`\n Year int `json:"year"`\n}\n\nvar books []Book\nvar nextID int = 1\nयहाँ books हमारी अस्थायी "डेटा परत" है, और nextID नई पुस्तकों को स्वचालित रूप से ID निर्दिष्ट करने के लिए एक काउंटर है।
चरण 3: HTTP अनुरोध हैंडलर (CRUD) लागू करें
\nअब सबसे दिलचस्प हिस्सा - आइए प्रत्येक HTTP विधि के लिए हैंडलर फ़ंक्शन लिखें। हम मानक राउटर http.NewServeMux का उपयोग करेंगे।
3.1. सभी पुस्तकें प्राप्त करें (GET /books)
\nfunc getBooks(w http.ResponseWriter, r *http.Request) {\n w.Header().Set("Content-Type", "application/json")\n json.NewEncoder(w).Encode(books)\n}\n\n3.2. नई पुस्तक बनाएं (POST /books)
\nfunc createBook(w http.ResponseWriter, r *http.Request) {\n var newBook Book\n if err := json.NewDecoder(r.Body).Decode(&newBook); err != nil {\n http.Error(w, "Invalid JSON", http.StatusBadRequest)\n return\n }\n newBook.ID = nextID\n nextID++\n books = append(books, newBook)\n w.Header().Set("Content-Type", "application/json")\n w.WriteHeader(http.StatusCreated)\n json.NewEncoder(w).Encode(newBook)\n}\n\n3.3. ID द्वारा एक पुस्तक प्राप्त करें (GET /books/{id})
\nमानक ServeMux में डायनामिक पथों के लिए समर्थन नहीं है, इसलिए हम मैन्युअल रूप से URL से ID निकालेंगे।
func getBook(w http.ResponseWriter, r *http.Request) {\n idStr := strings.TrimPrefix(r.URL.Path, "/books/")\n id, err := strconv.Atoi(idStr)\n if err != nil {\n http.Error(w, "Invalid ID", http.StatusBadRequest)\n return\n }\n for _, book := range books {\n if book.ID == id {\n w.Header().Set("Content-Type", "application/json")\n json.NewEncoder(w).Encode(book)\n return\n }\n }\n http.Error(w, "Book not found", http.StatusNotFound)\n}\n\n3.4. पुस्तक अपडेट करें (PUT /books/{id})
\nfunc updateBook(w http.ResponseWriter, r *http.Request) {\n idStr := strings.TrimPrefix(r.URL.Path, "/books/")\n id, err := strconv.Atoi(idStr)\n if err != nil {\n http.Error(w, "Invalid ID", http.StatusBadRequest)\n return\n }\n var updatedBook Book\n if err := json.NewDecoder(r.Body).Decode(&updatedBook); err != nil {\n h