परिचय: Go में HTTP-क्लाइंट क्यों ध्यान देने योग्य है
आधुनिक वेब एप्लिकेशन शायद ही कभी अलग-थलग काम करते हैं। लगभग कोई भी सेवा HTTP के माध्यम से बाहरी API, माइक्रोसर्विसेज या तीसरे पक्ष के संसाधनों के साथ इंटरैक्ट करती है। Go भाषा (Golang) एक अंतर्निहित शक्तिशाली लाइब्रेरी net/http प्रदान करती है, जो आपको बिना किसी तीसरे पक्ष की निर्भरता के कुशल और उच्च-प्रदर्शन वाले HTTP-क्लाइंट बनाने की अनुमति देती है।
इस लेख में, हम सीखेंगे कि Go में HTTP-क्लाइंट के साथ सही तरीके से कैसे काम करें: सरल GET-अनुरोधों से लेकर त्रुटि प्रबंधन और टाइमआउट प्रबंधन तक। आप जानेंगे कि सामान्य गलतियों से कैसे बचें और विश्वसनीय कोड कैसे लिखें।
Go में HTTP-क्लाइंट के साथ काम करने की मूल बातें
Go में net/http लाइब्रेरी को प्रदर्शन को ध्यान में रखकर डिज़ाइन किया गया है। कई अन्य भाषाओं के विपरीत, जहाँ प्रत्येक अनुरोध एक नया कनेक्शन बनाता है, Go डिफ़ॉल्ट रूप से कनेक्शन पूल (connection pool) का उपयोग करता है। इसका मतलब है कि TCP कनेक्शन का पुन: उपयोग किया जाता है, जो काम को काफी तेज करता है।
सबसे सरल GET-अनुरोध
हम सबसे सरल उदाहरण से शुरू करते हैं — http.Get() फ़ंक्शन का उपयोग करके GET-अनुरोध भेजना:
package main
import ( "fmt" "io" "net/http" "os")
func main() { // सरल GET-अनुरोध resp, err := http.Get("https://api.github.com") if err != nil { fmt.Printf("अनुरोध निष्पादित करने में त्रुटि: %v", err) os.Exit(1) } defer resp.Body.Close()
// प्रतिक्रिया का मुख्य भाग पढ़ें body, err := io.ReadAll(resp.Body) if err != nil { fmt.Printf("प्रतिक्रिया पढ़ने में त्रुटि: %v", err) os.Exit(1) }
fmt.Printf("स्थिति: %s", resp.Status) fmt.Printf("प्रतिक्रिया का मुख्य भाग: %s", string(body))}महत्वपूर्ण: हमेशा प्रतिक्रिया के मुख्य भाग को बंद करें (resp.Body.Close())। गारंटीकृत समापन के लिए defer का उपयोग करें, भले ही कोई त्रुटि हो।
पैरामीटर और हेडर के साथ GET-अनुरोध
अधिक जटिल अनुरोधों के लिए, http.Request ऑब्जेक्ट बनाने के साथ पूर्ण सिंटैक्स का उपयोग करना बेहतर है:
package main
import ( "fmt" "io" "net/http" "time")
func main() { // एक नया क्लाइंट बनाएँ client := &http.Client{ Timeout: 10 * time.Second, }
// एक अनुरोध बनाएँ req, err := http.NewRequest("GET", "https://api.example.com/users", nil) if err != nil { fmt.Printf("अनुरोध बनाने में त्रुटि: %v", err) return }
// हेडर जोड़ें req.Header.Set("Authorization", "Bearer your-token-here") req.Header.Set("Accept", "application/json") req.Header.Set("User-Agent", "Go-http-client/1.0")
// query-पैरामीटर जोड़ें q := req.URL.Query() q.Add("limit", "10") q.Add("offset", "0") req.URL.RawQuery = q.Encode()
// अनुरोध निष्पादित करें resp, err := client.Do(req) if err != nil { fmt.Printf("अनुरोध निष्पादित करने में त्रुटि: %v", err) return } defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body) fmt.Printf("प्रतिक्रिया: %s", string(body))}POST-अनुरोध और JSON के साथ काम करना
JSON-मुख्य भाग के साथ POST-अनुरोध REST API के साथ काम करते समय एक मानक कार्य है। Go डेटा को सीरियलाइज़ करने के लिए सुविधाजनक उपकरण प्रदान करता है।
POST का उपयोग करके JSON भेजना
package main
import ( "bytes" "encoding/json" "fmt" "net/http" "time")
type User struct { Name string `json:"name"` Email string `json:"email"` Age int `json:"age"`}
func main() { user := User{ Name: "इवान पेट्रोव", Email: "ivan@example.com", Age: 30, }
// स्ट्रक्चर को JSON में सीरियलाइज़ करें jsonData, err := json.Marshal(user) if err != nil { fmt.Printf("JSON सीरियलाइज़ेशन में त्रुटि: %v", err) return }
client := &http.Client{Timeout: 5 * time.Second}