Go में JSON Post Request हैंडलिंग: अनुभवी डेवलपर्स भी क्यों फंस जाते हैं
\n\nक्या आपने कभी Go में ऐसा सर्वर लिखा है जो POST रिक्वेस्ट के ज़रिए JSON स्वीकार करता हो, और अचानक आपको खाली स्ट्रक्चर या घातक एरर मिली हो? अगर हाँ — तो आप अकेले नहीं हैं। Stack Overflow पर "Handling JSON Post Request in Go" सवाल ने हज़ारों व्यूज़ और सैकड़ों जवाब जुटाए हैं। यह समुदाय का एक सच्चा "दर्द बिंदु" है।
\n\nइस लेख में हम सिर्फ यह नहीं देखेंगे कि JSON POST रिक्वेस्ट को सही तरीके से कैसे हैंडल किया जाए। हम उन टॉप गलतियों पर चलेंगे जिन पर नौसिखिए और यहाँ तक कि प्रोफेशनल भी पैर रख देते हैं। आप सीखेंगे कि सामान्य गलतियों से कैसे बचें, साफ कोड कैसे लिखें, और डीबगिंग में घंटों बर्बाद न करें। चलिए शुरू करते हैं!
\n\nJSON और Go: पहले बाइट से ही प्यार क्यों?
\n\nGo (या Golang) आधुनिक वेब सर्विसेज़ के लिए बनाया गया था। इसमें बिल्ट-इन पैकेज encoding/json एक शक्तिशाली टूल है। लेकिन, किसी भी शक्तिशाली टूल की तरह, इसे सही तरीके से संभालना ज़रूरी है। सबसे आम समस्या है — क्लाइंट द्वारा भेजे गए JSON और सर्वर द्वारा अपेक्षित स्ट्रक्चर के बीच बेमेल।
चलिए बेस से शुरू करते हैं — एक सही हैंडलर स्ट्रक्चर।
\n\nगलती #1: रिक्वेस्ट बॉडी को बंद करना भूलना
\n\nकिसी भी POST हैंडलर में सबसे पहला काम — रिक्वेस्ट बॉडी को ज़रूर बंद करें। यह सिर्फ अच्छा व्यवहार नहीं है, यह गारंटी है कि आपका सर्वर मेमोरी लीक नहीं करेगा।
\n\npackage main\n\nimport (\n "encoding/json"\n "net/http"\n)\n\ntype User struct {\n Name string `json:"name"`\n Email string `json:"email"`\n}\n\nfunc handler(w http.ResponseWriter, r *http.Request) {\n // ज़रूरी: Body को बंद करें\n defer r.Body.Close()\n\n // ... बाकी कोड\n}\n\nकई नौसिखिए इस लाइन को छोड़ देते हैं, और सर्वर मेमोरी "खाने" लगता है। हमेशा रिक्वेस्ट मिलते ही defer r.Body.Close() का उपयोग करें।
गलती #2: रिक्वेस्ट मेथड की जाँच को नज़रअंदाज़ करना
\n\nआपके हैंडलर को स्पष्ट रूप से जाँचना चाहिए कि रिक्वेस्ट POST है, न कि GET या PUT। अन्यथा, आपको पैनिक या अजीब व्यवहार का सामना करना पड़ सकता है।
\n\nfunc handler(w http.ResponseWriter, r *http.Request) {\n defer r.Body.Close()\n\n if r.Method != http.MethodPost {\n http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)\n return\n }\n\n // ... अब JSON के साथ काम करें\n}\n\nयह सरल नियम आपको कई सिरदर्दों से बचाएगा। हमेशा मेथड की जाँच करें — यह कोड की बुनियादी स्वच्छता है।
\n\nगलती #3: गैर-सख्त JSON डिकोडर का उपयोग करना
\n\nडिफ़ॉल्ट रूप से, Go में json.Decoder एरर नहीं फेंकता अगर JSON में अतिरिक्त फ़ील्ड हैं जो आपके स्ट्रक्चर में नहीं हैं। इससे आप अमान्य डेटा को "निगल" सकते हैं।
बचाव का नुस्खा — json.Decoder का उपयोग DisallowUnknownFields विकल्प के साथ करें:
func handler(w http.ResponseWriter, r *http.Request) {\n defer r.Body.Close()\n\n var user User\n\n decoder := json.NewDecoder(r.Body)\n // सख्त मोड चालू करें\n decoder.DisallowUnknownFields()\n\n err := decoder.Decode(&user)\n if err != nil {\n http.Error(w, "Invalid JSON: "+err.Error(), http.StatusBadRequest)\n return\n }\n\n // अगर JSON में अतिरिक्त फ़ील्ड थे — एरर मिलेगी\n // यह API में आकस्मिक टाइपो से बचाता है\n\n w.WriteHeader(http.StatusOK)\n json.NewEncoder(w).Encode(user)\n}\n\nयह तरीका विशेष रूप से तब उपयोगी है जब आप पब्लिक API विकसित कर रहे हों। क्लाइंट स्पष्ट एरर के लिए आभारी होंगे।
\n\nगलती #4: यह जाँच न करना कि JSON खाली तो नहीं है
\n\nकल्पना करें: क्लाइंट एक खाली रिक्वेस्ट बॉडी भेजता है। आपका कोड बिना किसी समस्या के खाली JSON {} को डिकोड करेगा और शून्य मानों वाला एक स्ट्रक्चर बनाएगा। यह वह नहीं हो सकता जिसकी आप उम्मीद कर रहे हैं।
सबसे अच्छा अभ्यास है — यह जाँचना कि बॉडी खाली नहीं है, और सभी अनिवार्य फ़ील्ड भरे हुए हैं:
\n\nfunc hand