परिचय
Go (Golang) — Google का एक आधुनिक कंपाइल्ड भाषा है, जो उच्च-लोड वाले नेटवर्क सेवाओं के निर्माण के लिए आदर्श है। बिल्ट-इन पैकेज net/http एक शक्तिशाली और लचीला HTTP-क्लाइंट प्रदान करता है, जो REST API, वेब सर्वर और अन्य HTTP संसाधनों के साथ आसानी से इंटरैक्ट करने की अनुमति देता है। हालांकि, स्पष्ट सादगी के बावजूद, शुरुआती अक्सर सामान्य गलतियाँ करते हैं: वे रिस्पॉन्स बॉडी को बंद करना भूल जाते हैं, टाइमआउट को हैंडल नहीं करते, या एरर को अनदेखा करते हैं।
इस लेख में, हम Go में HTTP-क्लाइंट का सही उपयोग करने का तरीका समझेंगे। आप सीखेंगे कि GET और POST अनुरोध कैसे करें, हेडर को कैसे मैनेज करें, टाइमआउट कैसे सेट करें और एरर को कैसे हैंडल करें। सभी कोड उदाहरण आपके प्रोजेक्ट में उपयोग के लिए तैयार हैं।
1. मूल बातें: GET-अनुरोध और रिस्पॉन्स पढ़ना
GET-अनुरोध करने का सबसे सरल तरीका http.Get() फ़ंक्शन का उपयोग करना है। हालांकि, प्रोडक्शन कोड के लिए, अपना स्वयं का http.Client इंस्टेंस बनाने की सिफारिश की जाती है — यह क्लाइंट के व्यवहार पर अधिक नियंत्रण देता है।
सरल GET-अनुरोध
package main
import ( "fmt" "io" "net/http" "os")
func main() { // क्लाइंट बनाएँ (अभी डिफ़ॉल्ट सेटिंग्स के साथ) client := &http.Client{} // GET-अनुरोध निष्पादित करें resp, err := client.Get("https://api.example.com/data") if err != nil { fmt.Fprintf(os.Stderr, "अनुरोध त्रुटि: %v", err) os.Exit(1) } // महत्वपूर्ण: रिस्पॉन्स बॉडी को बंद करें defer resp.Body.Close()
// रिस्पॉन्स बॉडी पढ़ें body, err := io.ReadAll(resp.Body) if err != nil { fmt.Fprintf(os.Stderr, "बॉडी पढ़ने में त्रुटि: %v", err) os.Exit(1) }
fmt.Printf("स्थिति: %s", resp.Status) fmt.Printf("बॉडी: %s", body)}मुख्य बिंदु:
defer resp.Body.Close()— रिस्पॉन्स बॉडी को बंद करना अनिवार्य है, अन्यथा संसाधन लीक हो जाएगा (कनेक्शन पूल में वापस नहीं आएगा)।- हमेशा
errकी जाँच करें — नेटवर्क अस्थिर है, और अनुरोध विफल हो सकता है। - सफलता (2xx) को सर्वर त्रुटियों (4xx, 5xx) से अलग करने के लिए HTTP-स्थिति (
resp.StatusCode) की जाँच करें।
2. बॉडी और हेडर के साथ POST-अनुरोध
सर्वर पर डेटा (जैसे JSON) भेजने के लिए http.Post() या अधिक लचीली विधि http.NewRequest() का उपयोग किया जाता है, जिसके बाद client.Do() कॉल किया जाता है। दूसरा तरीका बेहतर है, क्योंकि यह हेडर और अन्य पैरामीटर सेट करने की अनुमति देता है।
JSON डेटा के साथ POST
package main
import ( "bytes" "encoding/json" "fmt" "net/http" "os")
type User struct { Name string `json:"name"` Email string `json:"email"`}
func main() { client := &http.Client{}
// डेटा तैयार करें user := User{Name: "इवान पेत्रोव", Email: "ivan@example.com"} jsonData, err := json.Marshal(user) if err != nil { fmt.Fprintf(os.Stderr, "JSON सीरियलाइज़ेशन त्रुटि: %v", err) os.Exit(1) }
// अनुरोध बनाएँ req, err := http.NewRequest("POST", "https://api.example.com/users", bytes.NewBuffer(jsonData)) if err != nil { fmt.Fprintf(os.Stderr, "अनुरोध निर्माण त्रुटि: %v", err) os.Exit(1) }
// हेडर सेट करें req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer YOUR_TOKEN_HERE")
// अनुरोध भेजें resp, err := client.Do(req) if err != nil { fmt.Fprintf(os.Stderr, "अनुरोध त्रुटि: %v", err) os.Exit(1) } defer resp.Body.Close()
// स्थिति जाँचें if resp.StatusCode != http.StatusCreated { fmt.Fprintf(os.Stderr, "सर्वर ने त्रुटि लौटाई: %s", resp.Status) os.Exit(1) }
fmt.Println("उपयोगकर्ता सफलतापूर्वक बनाया गया!")}महत्वपूर्ण