Go में JSON के साथ POST अनुरोध: शुरुआत से प्रोडक्शन तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go में POST अनुरोध में JSON भेजना: "यह कैसे काम करता है" से "कर दिया और भूल गए" तक

\n\n

क्या आप कभी Stack Overflow पर अटके हैं, यह समझने की कोशिश कर रहे हैं कि Go पर आपका JSON के साथ POST अनुरोध सर्वर द्वारा क्यों स्वीकार नहीं किया जा रहा है? परिचित लगता है: सब कुछ सही लगता है, लेकिन जवाब में 400 Bad Request या खाली बॉडी आती है। पता चला, Go में JSON भेजने के कई तरीके हैं, और सही तरीका चुनना सिर्फ स्वाद का सवाल नहीं है, बल्कि आपके माइक्रोसर्विस की स्थिरता का सवाल है।

\n\n

इस लेख में हम सिर्फ कोड नहीं दिखाएंगे। हम तीन दृष्टिकोणों का विश्लेषण करेंगे: भोले (जो काम करता है लेकिन खतरनाक है) से लेकर सही एरर हैंडलिंग और कॉन्टेक्स्ट के साथ प्रोडक्शन-रेडी समाधान तक। यदि आप API, बॉट या इंटीग्रेशन के लिए Go में लिख रहे हैं, तो यह अनिवार्य पठन है।

\n\n

यह विषय इतना लोकप्रिय क्यों है?

\n

Go नेटवर्क सेवाओं के लिए एक भाषा है। देर-सबेर हर डेवलपर को इस कार्य का सामना करना पड़ता है: "POST अनुरोध के बॉडी में JSON भेजें"। इसमें मुश्किल क्या हो सकती है? लेकिन बारीकियाँ हैं:

\n
    \n
  • स्ट्रक्चर को JSON में सही ढंग से सीरियलाइज़ करना (मार्शलिंग) आवश्यक है।
  • \n
  • हेडर Content-Type: application/json को न भूलना महत्वपूर्ण है।
  • \n
  • प्रतिक्रिया के बॉडी को सही ढंग से बंद करना आवश्यक है।
  • \n
  • मेमोरी लीक और पैनिक से बचना वांछनीय है।
  • \n
\n

आइए वास्तविक उदाहरणों के साथ प्रत्येक दृष्टिकोण का विश्लेषण करें।

\n\n

दृष्टिकोण 1: "जल्दी-जल्दी" — bytes.NewBuffer + json.Marshal

\n

यह सबसे सरल तरीका है। एक स्ट्रक्चर लें, इसे बाइट्स में मार्शल करें, बफर में डालें और भेजें। कई शुरुआती Go डेवलपर ठीक ऐसे ही लिखते हैं।

\n\n
package main\n\nimport (\n    "bytes"\n    "encoding/json"\n    "fmt"\n    "net/http"\n)\n\ntype User struct {\n    Name  string `json:"name"`\n    Email string `json:"email"`\n}\n\nfunc main() {\n    user := User{Name: "इवान पेत्रोव", Email: "ivan@example.com"}\n    \n    // चरण 1: स्ट्रक्चर को JSON में मार्शल करें\n    jsonData, err := json.Marshal(user)\n    if err != nil {\n        fmt.Println("मार्शलिंग त्रुटि:", err)\n        return\n    }\n    \n    // चरण 2: POST अनुरोध बनाएँ\n    resp, err := http.Post(\n        "https://api.example.com/users",\n        "application/json",\n        bytes.NewBuffer(jsonData),\n    )\n    if err != nil {\n        fmt.Println("अनुरोध त्रुटि:", err)\n        return\n    }\n    defer resp.Body.Close()\n    \n    fmt.Println("स्थिति:", resp.Status)\n}\n
\n\n

इस दृष्टिकोण के फायदे और नुकसान

\n
    \n
  • फायदा: न्यूनतम कोड, शुरुआती के लिए समझने योग्य।
  • \n
  • नुकसान: कोई लचीलापन नहीं। आप कस्टम हेडर (प्रमाणीकरण, trace-id) नहीं जोड़ सकते। टाइमआउट पर कोई नियंत्रण नहीं। यदि सर्वर त्रुटि लौटाता है, तो आप इसे हैंडल नहीं करेंगे।
  • \n
  • नुकसान: संभावित समस्या: यदि json.Marshal त्रुटि लौटाता है, तो आप इसे पकड़ लेंगे, लेकिन वास्तविक कोड में अक्सर जाँच करना भूल जाते हैं।
  • \n
\n

यह तरीका प्रोटोटाइप और परीक्षणों के लिए उपयुक्त है। प्रोडक्शन के लिए नहीं।

\n\n

दृष्टिकोण 2: "सही" — http.NewRequest + json.NewEncoder

\n

Go समुदाय http.NewRequest और json.NewEncoder का उपयोग करने की सलाह देता है। क्यों? क्योंकि यह अनुरोध पर पूर्ण नियंत्रण देता है और मेमोरी में अधिक कुशल है।

\n\n
package main\n\nimport (\n    "bytes"\n    "encoding/json"\n    "fmt"\n    "net/http"\n    "time"\n)\n\ntype Order struct {\n    ID     int     `json:"id"`\n    Amount float64 `json:"amount"`\n    Items  []string `json:"items"`\n}\n\nfunc sendOrder(order Order) error {\n    // बफर और एनकोडर बनाएँ\n    var buf bytes.Buffer\n    enc := json.NewEncoder(&buf)\n    \n    // सीधे बफर में एनकोड करें (बिना मध्यवर्ती []byte के)\n    if err := enc.Encode(order); err != nil {\n        return fmt.Errorf("JSON एनकोडिंग त्रुटि: %w", err)\n    }\n    \n    // अनुरोध बनाएँ\n    req, err := http.NewRequest("POST", "https://api.example.com/orders", &buf)\n    if err != nil {\n        return fmt.Errorf("अनुरोध निर्माण त्रुटि: %w", err)\n    }\n    \n    // हेडर सेट करें\n    req.Header.Set("Content-Type", "application/json")\n    req.Hea                

ब्लॉग

पुस्तक अनुशंसाएँ