Go में HTTP GET अनुरोध में हेडर कैसे सेट करें? कोड के साथ पूर्ण व्याख्या
\n\nक्या आपने कभी किसी सर्वर पर HTTP GET अनुरोध भेजने की कोशिश की और उसने प्रमाणीकरण त्रुटि लौटाई? या हो सकता है, API ने आपके अनुरोध को अनदेखा कर दिया, जबकि आपको पक्का पता था कि इसे काम करना चाहिए? 90% मामलों में, समस्या HTTP हेडर में होती है। यह एक पार्टी के पास की तरह है: सही दस्तावेज़ के बिना आपको अंदर नहीं जाने दिया जाएगा।
\n\nइस लेख में, हम जानेंगे कि Go (Golang) में HTTP GET अनुरोधों में हेडर को पेशेवर तरीके से कैसे प्रबंधित किया जाए। आप न केवल मूल सिंटैक्स सीखेंगे, बल्कि उन सामान्य गलतियों के बारे में भी जानेंगे जिनमें अनुभवी डेवलपर भी फंस जाते हैं। चलिए शुरू करते हैं!
\n\nहेडर क्यों महत्वपूर्ण हैं?
\n\nकल्पना करें कि HTTP अनुरोध एक पत्र वाला लिफाफा है। लिफाफा (अनुरोध का मुख्य भाग) खाली हो सकता है, लेकिन उस पर लिखी जानकारी (हेडर) सब कुछ तय करती है:
\n- \n
- Content-Type — डेटा का प्रारूप (JSON, XML, Form) \n
- Authorization — API तक पहुंच की कुंजी (Bearer token, Basic Auth) \n
- User-Agent — क्लाइंट की पहचान (ताकि आपको बॉट के रूप में ब्लॉक न किया जाए) \n
- Accept — आप प्रतिक्रिया के किस प्रारूप की अपेक्षा करते हैं \n
सही हेडर के बिना, सर्वर यह नहीं समझ पाएगा कि आप उससे क्या चाहते हैं।
\n\nतरीका 1: पुराना और अच्छा http.Get (और यह क्यों उपयुक्त नहीं है)
\n\nGo में कई नौसिखिए http.Get() से शुरुआत करते हैं। यह परीक्षणों के लिए सुविधाजनक है, लेकिन इस विधि में एक बड़ी कमी है — हेडर सेट नहीं किए जा सकते।
package main\n\nimport (\n "fmt"\n "io/ioutil"\n "net/http"\n)\n\nfunc main() {\n // इस तरह हेडर नहीं जोड़े जा सकते!\n resp, err := http.Get("https://api.example.com/data")\n if err != nil {\n panic(err)\n }\n defer resp.Body.Close()\n\n body, _ := ioutil.ReadAll(resp.Body)\n fmt.Println(string(body))\n}\n\n\nयह कोड बस एक "खाली" अनुरोध भेजता है। यदि API को प्रमाणीकरण टोकन की आवश्यकता है — तो आपको 401 Unauthorized मिलेगा। वास्तविक प्रोजेक्ट्स के लिए यह दृष्टिकोण उपयुक्त नहीं है।
तरीका 2: अपना स्वयं का अनुरोध बनाएं (सही तरीका)
\n\nGo में अनुरोधों को बारीकी से कॉन्फ़िगर करने के लिए कंस्ट्रक्टर http.NewRequest() का उपयोग किया जाता है। यह एक *http.Request ऑब्जेक्ट लौटाता है, जिसके साथ हेडर सेट करने सहित कुछ भी किया जा सकता है।
यहाँ मूल संरचना है:
\n\npackage main\n\nimport (\n "fmt"\n "io/ioutil"\n "net/http"\n)\n\nfunc main() {\n // 1. URL बनाएं\n url := "https://api.github.com/users/golang"\n\n // 2. एक नया GET अनुरोध बनाएं\n req, err := http.NewRequest("GET", url, nil)\n if err != nil {\n panic(err)\n }\n\n // 3. हेडर सेट करें\n req.Header.Set("User-Agent", "MyGoApp/1.0")\n req.Header.Set("Accept", "application/json")\n\n // 4. HTTP क्लाइंट के माध्यम से अनुरोध भेजें\n client := &http.Client{}\n resp, err := client.Do(req)\n if err != nil {\n panic(err)\n }\n defer resp.Body.Close()\n\n body, _ := ioutil.ReadAll(resp.Body)\n fmt.Println(string(body))\n}\n\n\nध्यान दें: हम req.Header.Set() का उपयोग कर रहे हैं, न कि req.Header.Add() का। अंतर महत्वपूर्ण है:
- \n
- Set — मौजूदा मान को बदलता है (यदि ऐसा हेडर पहले से मौजूद है) \n
- Add — मौजूदा मान में एक और मान जोड़ता है (डुप्लिकेट बनाता है) \n
अधिकांश मामलों के लिए Set का उपयोग करें — यह अधिक सुरक्षित है।
तरीका 3: प्रमाणीकरण के साथ काम करना (Bearer Token)
\n\nसबसे सामान्य परिदृश्य JWT टोकन का स्थानांतरण है। इसे सही तरीके से करने का तरीका यहाँ है:
\n\npackage main\n\nimport (\n "fmt"\n "net/http"\n)\n\nfunc main() {\n token := "your_jwt_token_here"\n url := "https://api.example.com/protected"\n\n req, _ := http.NewRequest("GET", url, nil)\n\n // Authorization हेडर सेट करें\n req.Heade