परिचय: Go में HTTP के साथ काम करना क्यों ज़रूरी है
\nGo (Golang) एक ऐसी भाषा है जो नेटवर्किंग के लिए बनाई गई है। इसकी स्टैंडर्ड लाइब्रेरी net/http सर्वर और क्लाइंट दोनों बनाने के लिए शक्तिशाली और लचीले टूल्स प्रदान करती है। लेकिन कई डेवलपर्स, खासकर स्क्रिप्टिंग भाषाओं से आने वाले, सामान्य गलतियाँ करते हैं: रिस्पॉन्स बॉडी को बंद करना भूल जाते हैं, टाइमआउट सेट नहीं करते, या एरर को गलत तरीके से हैंडल करते हैं।
इस लेख में हम Go में HTTP क्लाइंट बनाना 'शुरू से अंत तक' सीखेंगे। आप जानेंगे कि GET और POST रिक्वेस्ट कैसे भेजें, हेडर को कैसे मैनेज करें, टाइमआउट कैसे सेट करें और एरर को कैसे हैंडल करें। सभी कोड उदाहरण उपयोग के लिए तैयार हैं।
\n\n1. बुनियादी बातें: क्लाइंट बनाना और पहला GET-रिक्वेस्ट
\nGo में HTTP-क्लाइंट एक स्ट्रक्चर http.Client है। आप ग्लोबल क्लाइंट http.DefaultClient का उपयोग कर सकते हैं या अपनी कस्टम सेटिंग्स के साथ अपना क्लाइंट बना सकते हैं। चलिए एक सरल GET-रिक्वेस्ट से शुरू करते हैं।
package main\n\nimport (\n "fmt"\n "io"\n "net/http"\n "os"\n)\n\nfunc main() {\n // बिल्ट-इन क्लाइंट का उपयोग करें\n resp, err := http.Get("https://api.example.com/data")\n if err != nil {\n fmt.Printf("रिक्वेस्ट में एरर: %v\\n", err)\n os.Exit(1)\n }\n defer resp.Body.Close() // महत्वपूर्ण: हमेशा रिस्पॉन्स बॉडी को बंद करें!\n\n // रिस्पॉन्स बॉडी पढ़ें\n body, err := io.ReadAll(resp.Body)\n if err != nil {\n fmt.Printf("रिस्पॉन्स पढ़ने में एरर: %v\\n", err)\n os.Exit(1)\n }\n\n fmt.Printf("स्टेटस: %s\\n", resp.Status)\n fmt.Printf("बॉडी: %s\\n", string(body))\n}\nमुख्य बिंदु:
\n- \n
- हमेशा
resp.Bodyकोdeferके माध्यम से बंद करें। अन्यथा रिसोर्स लीक होगा (कनेक्शन पूल में वापस नहीं आएंगे)। \n - रिस्पॉन्स स्टेटस (
resp.StatusCode) की जाँच करें। कोड 200 ही एकमात्र सफल कोड नहीं है (201, 204 आदि भी होते हैं)। \n io.ReadAllपूरी बॉडी को मेमोरी में पढ़ता है। बड़े रिस्पॉन्स के लिएio.Copyया स्ट्रीमिंग प्रोसेसिंग का उपयोग करें। \n
2. एडवांस्ड क्लाइंट: टाइमआउट, हेडर और कस्टम सेटिंग्स
\nग्लोबल क्लाइंट में डिफ़ॉल्ट रूप से कोई टाइमआउट नहीं होता — इससे प्रोग्राम हैंग हो सकता है। हमेशा अपनी सेटिंग्स के साथ अपना क्लाइंट बनाएं।
\n2.1. टाइमआउट के साथ क्लाइंट बनाना
\nclient := &http.Client{\n Timeout: 10 * time.Second, // पूरे रिक्वेस्ट के लिए कुल टाइमआउट\n}\n\nresp, err := client.Get("https://api.example.com/data")\nआप Transport के माध्यम से विभिन्न स्तरों पर टाइमआउट सेट कर सकते हैं:
transport := &http.Transport{\n DialContext: (&net.Dialer{\n Timeout: 5 * time.Second, // कनेक्शन टाइमआउट\n KeepAlive: 30 * time.Second,\n }).DialContext,\n TLSHandshakeTimeout: 5 * time.Second,\n ResponseHeaderTimeout: 5 * time.Second,\n}\n\nclient := &http.Client{\n Transport: transport,\n Timeout: 15 * time.Second,\n}\n\n2.2. हेडर और पैरामीटर जोड़ना
\nजटिल रिक्वेस्ट के लिए http.NewRequest का उपयोग करें:
req, err := http.NewRequest("GET", "https://api.example.com/search", nil)\nif err != nil {\n log.Fatal(err)\n}\n\n// हेडर जोड़ें\nreq.Header.Set("Authorization", "Bearer your-token")\nreq.Header.Set("Accept", "application/json")\n\n// query-पैरामीटर जोड़ें\nq := req.URL.Query()\nq.Add("query", "golang")\nq.Add("page", "1")\nreq.URL.RawQuery = q.Encode()\n\nresp, err := client.Do(req)\n\n3. POST और अन्य मेथड्स के साथ काम करना (JSON, फॉर्म)
\nPOST-रिक्वेस्ट में बॉडी भेजना ज़रूरी होता है। आइए दो लोकप्रिय फॉर्मेट देखें: JSON और URL-encoded फॉर्म।
\n3.1. JSON के साथ POST
\ntype RequestData struct {\n Name string `json:"name"`\n Email string `json:"email"`\n}\n\ndata := RequestData{\n Name: "राहुल",\n Email: "rahul@example.com",\n}\n\njsonData, err := json.Marshal(data)