परिचय: REST API के लिए Go क्यों?
\nGo (Golang) एक आधुनिक कंपाइल की जाने वाली भाषा है जिसमें समवर्तीता के लिए अंतर्निहित समर्थन और उच्च प्रदर्शन है। Go पर REST API तेजी से काम करता है, कम मेमोरी खपत करता है और आसानी से स्केलेबल है। 30 मिनट में आप केवल मानक लाइब्रेरी का उपयोग करके GET, POST, PUT और DELETE अनुरोधों के साथ एक पूर्ण REST सेवा बनाएंगे।
\nइस मार्गदर्शिका में हम कार्यों की सूची (Todo app) के प्रबंधन के लिए एक API लिखेंगे। आप सीखेंगे कि रूटिंग कैसे सेट करें, JSON को कैसे संभालें, लॉगिंग के लिए मिडलवेयर कैसे जोड़ें और त्रुटियों को सही तरीके से कैसे लौटाएं। बिना किसी तृतीय-पक्ष फ्रेमवर्क के — केवल शुद्ध Go!
\n\n1. प्रोजेक्ट सेटअप और संरचना
\nप्रोजेक्ट के लिए एक नई निर्देशिका बनाएं और Go मॉड्यूल को इनिशियलाइज़ करें:
\nmkdir go-todo-api\ncd go-todo-api\ngo mod init todo-api\nप्रोजेक्ट संरचना सरल होगी:
\n- \n
main.go— एंट्री पॉइंट और सर्वर स्टार्ट \nhandlers.go— अनुरोध हैंडलर \nmodels.go— डेटा संरचनाएं \nmiddleware.go— मिडलवेयर \n
कार्य संरचना के साथ models.go फ़ाइल बनाएं:
package main\n\ntype Task struct {\n ID int `json:"id"`\n Title string `json:"title"`\n Completed bool `json:"completed"`\n}\nहम सरलता के लिए कार्यों को मेमोरी (tasks स्लाइस) में संग्रहीत करेंगे। वास्तविक प्रोजेक्ट में डेटाबेस का उपयोग करें।
\n\n2. रूटिंग और हैंडलर
\nGo अंतर्निहित पैकेज net/http का उपयोग करता है। आइए मुख्य हैंडलर के साथ handlers.go फ़ाइल बनाएं।
2.1. GET /tasks — सभी कार्य प्राप्त करें
\npackage main\n\nimport (\n "encoding/json"\n "net/http"\n "strconv"\n)\n\nvar tasks = []Task{}\nvar nextID = 1\n\nfunc getTasks(w http.ResponseWriter, r *http.Request) {\n w.Header().Set("Content-Type", "application/json")\n json.NewEncoder(w).Encode(tasks)\n}\n2.2. POST /tasks — नया कार्य बनाएं
\nfunc createTask(w http.ResponseWriter, r *http.Request) {\n var newTask Task\n if err := json.NewDecoder(r.Body).Decode(&newTask); err != nil {\n http.Error(w, "Invalid JSON", http.StatusBadRequest)\n return\n }\n newTask.ID = nextID\n nextID++\n tasks = append(tasks, newTask)\n w.Header().Set("Content-Type", "application/json")\n w.WriteHeader(http.StatusCreated)\n json.NewEncoder(w).Encode(newTask)\n}\n2.3. PUT /tasks/{id} — कार्य अपडेट करें
\nfunc updateTask(w http.ResponseWriter, r *http.Request) {\n idStr := r.PathValue("id")\n id, err := strconv.Atoi(idStr)\n if err != nil {\n http.Error(w, "Invalid task ID", http.StatusBadRequest)\n return\n }\n \n var updatedTask Task\n if err := json.NewDecoder(r.Body).Decode(&updatedTask); err != nil {\n http.Error(w, "Invalid JSON", http.StatusBadRequest)\n return\n }\n \n for i, t := range tasks {\n if t.ID == id {\n tasks[i].Title = updatedTask.Title\n tasks[i].Completed = updatedTask.Completed\n w.Header().Set("Content-Type", "application/json")\n json.NewEncoder(w).Encode(tasks[i])\n return\n }\n }\n http.Error(w, "Task not found", http.StatusNotFound)\n}\n2.4. DELETE /tasks/{id} — कार्य हटाएं
\nfunc deleteTask(w http.ResponseWriter, r *http.Request) {\n idStr := r.PathValue("id")\n id, err := strconv.Atoi(idStr)\n if err != nil {\n http.Error(w, "Invalid task ID", http.StatusBadRequest)\n return\n }\n \n for i, t := range tasks {\n if t.ID == id {\n tasks = append(tasks[:i], tasks[i+1:]...)\n w.WriteHeader(http.StatusNoContent)\n return\n }\n }\n http.Error(w, "Task not found", http.StatusNotFound)\n}\nध्यान दें