Go में HTTP क्लाइंट: सही तरीके से रिक्वेस्ट करना सीखें

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

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

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

परिचय: Go में HTTP के साथ काम करना क्यों ज़रूरी है

\n

Go (Golang) एक ऐसी भाषा है जो नेटवर्किंग के लिए बनाई गई है। इसकी स्टैंडर्ड लाइब्रेरी net/http सर्वर और क्लाइंट दोनों बनाने के लिए शक्तिशाली और लचीले टूल्स प्रदान करती है। लेकिन कई डेवलपर्स, खासकर स्क्रिप्टिंग भाषाओं से आने वाले, सामान्य गलतियाँ करते हैं: रिस्पॉन्स बॉडी को बंद करना भूल जाते हैं, टाइमआउट सेट नहीं करते, या एरर को गलत तरीके से हैंडल करते हैं।

\n

इस लेख में हम Go में HTTP क्लाइंट बनाना 'शुरू से अंत तक' सीखेंगे। आप जानेंगे कि GET और POST रिक्वेस्ट कैसे भेजें, हेडर को कैसे मैनेज करें, टाइमआउट कैसे सेट करें और एरर को कैसे हैंडल करें। सभी कोड उदाहरण उपयोग के लिए तैयार हैं।

\n\n

1. बुनियादी बातें: क्लाइंट बनाना और पहला GET-रिक्वेस्ट

\n

Go में HTTP-क्लाइंट एक स्ट्रक्चर http.Client है। आप ग्लोबल क्लाइंट http.DefaultClient का उपयोग कर सकते हैं या अपनी कस्टम सेटिंग्स के साथ अपना क्लाइंट बना सकते हैं। चलिए एक सरल GET-रिक्वेस्ट से शुरू करते हैं।

\n
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
\n\n

2. एडवांस्ड क्लाइंट: टाइमआउट, हेडर और कस्टम सेटिंग्स

\n

ग्लोबल क्लाइंट में डिफ़ॉल्ट रूप से कोई टाइमआउट नहीं होता — इससे प्रोग्राम हैंग हो सकता है। हमेशा अपनी सेटिंग्स के साथ अपना क्लाइंट बनाएं।

\n

2.1. टाइमआउट के साथ क्लाइंट बनाना

\n
client := &http.Client{\n    Timeout: 10 * time.Second, // पूरे रिक्वेस्ट के लिए कुल टाइमआउट\n}\n\nresp, err := client.Get("https://api.example.com/data")
\n

आप Transport के माध्यम से विभिन्न स्तरों पर टाइमआउट सेट कर सकते हैं:

\n
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\n

2.2. हेडर और पैरामीटर जोड़ना

\n

जटिल रिक्वेस्ट के लिए http.NewRequest का उपयोग करें:

\n
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\n

3. POST और अन्य मेथड्स के साथ काम करना (JSON, फॉर्म)

\n

POST-रिक्वेस्ट में बॉडी भेजना ज़रूरी होता है। आइए दो लोकप्रिय फॉर्मेट देखें: JSON और URL-encoded फॉर्म।

\n

3.1. JSON के साथ POST

\n
type 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)

ब्लॉग

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