curl کمانڈز کو Go کوڈ میں تبدیل کریں - API ریکویسٹس کے لیے استعمال کے لیے تیار Go net/http کوڈ تیار کریں
// Go code will appear here // Example: package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" ) func main() { url := "https://api.example.com/data" // Create request payload payload := map[string]interface{}{ "name": "test", } jsonData, err := json.Marshal(payload) if err != nil { fmt.Println("Error marshaling JSON:", err) return } // Create request req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { fmt.Println("Error creating request:", err) return } // Add headers req.Header.Set("Content-Type", "application/json") // Send request client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() // Read response body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response:", err) return } fmt.Println("Status:", resp.Status) fmt.Println("Response:", string(body)) }
یہاں کچھ عام curl کمانڈز ہیں جنہیں آپ Go کوڈ میں تبدیل کر سکتے ہیں:
curl https://api.example.com/users
curl -X POST -H "Content-Type: application/json" -d '{"name":"John","email":"[email protected]"}' https://api.example.com/users
curl -X PUT -H "Authorization: Bearer token123" -d '{"status":"active"}' https://api.example.com/users/1
curl -X DELETE https://api.example.com/users/1
curl -H "X-API-Key: abc123" -H "Accept: application/json" https://api.example.com/data
Go کا net/http پیکیج HTTP ریکویسٹس بنانے کا ایک طاقتور اور موثر طریقہ فراہم کرتا ہے۔ یہاں کچھ عام Go HTTP پیٹرنز ہیں:
package main import ( "bytes" "fmt" "io" "io/ioutil" "mime/multipart" "net/http" "os" "path/filepath" ) func main() { url := "https://api.example.com/upload" // Create a buffer to store the multipart form var requestBody bytes.Buffer multipartWriter := multipart.NewWriter(&requestBody) // Open the file file, err := os.Open("document.pdf") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // Create a form file field fileWriter, err := multipartWriter.CreateFormFile("file", filepath.Base("document.pdf")) if err != nil { fmt.Println("Error creating form file:", err) return } // Copy the file content to the form field _, err = io.Copy(fileWriter, file) if err != nil { fmt.Println("Error copying file to form:", err) return } // Add other form fields if needed multipartWriter.WriteField("description", "Sample document upload") // Close the multipart writer multipartWriter.Close() // Create request req, err := http.NewRequest("POST", url, &requestBody) if err != nil { fmt.Println("Error creating request:", err) return } // Set the content type with the boundary req.Header.Set("Content-Type", multipartWriter.FormDataContentType()) req.Header.Set("Authorization", "Bearer YOUR_TOKEN_HERE") // Send request client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() // Read response body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response:", err) return } fmt.Println("Status:", resp.Status) fmt.Println("Response:", string(body)) }
package main import ( "context" "encoding/json" "fmt" "io/ioutil" "net/http" "time" ) func main() { // Create a context with timeout ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // Create request req, err := http.NewRequestWithContext(ctx, "GET", "https://api.example.com/data", nil) if err != nil { fmt.Println("Error creating request:", err) return } // Send request client := &http.Client{} resp, err := client.Do(req) // Handle errors if err != nil { if ctx.Err() == context.DeadlineExceeded { fmt.Println("Request timed out") } else { fmt.Println("Error sending request:", err) } return } defer resp.Body.Close() // Check status code if resp.StatusCode != http.StatusOK { fmt.Printf("Server returned non-200 status: %s\n", resp.Status) body, _ := ioutil.ReadAll(resp.Body) fmt.Println("Response body:", string(body)) return } // Read and parse response var data map[string]interface{} body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response:", err) return } err = json.Unmarshal(body, &data) if err != nil { fmt.Println("Error parsing JSON:", err) fmt.Println("Raw response:", string(body)) return } fmt.Println("Successfully received data:", data) }
اپنی curl کمانڈ کاپی کریں → ان پٹ باکس میں پیسٹ کریں → فوری طور پر Go کوڈ حاصل کریں
// Always check for errors in Go resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() // Check status code if resp.StatusCode != http.StatusOK { fmt.Printf("Server returned non-200 status: %s\n", resp.Status) body, _ := ioutil.ReadAll(resp.Body) fmt.Println("Response body:", string(body)) return }
// Create a context with timeout ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // Create request with context req, err := http.NewRequestWithContext(ctx, "GET", "https://api.example.com/data", nil) if err != nil { fmt.Println("Error creating request:", err) return } // Send request client := &http.Client{} resp, err := client.Do(req) // Check for timeout if err != nil { if ctx.Err() == context.DeadlineExceeded { fmt.Println("Request timed out") } else { fmt.Println("Error sending request:", err) } return }
جواب: جبکہ curl HTTP ریکویسٹس بنانے کے لیے ایک کمانڈ لائن ٹول ہے، Go کا net/http پیکیج ایک پروگراماٹک API فراہم کرتا ہے۔ Go مضبوط ٹائپنگ، بلٹ-ان کنکرنسی سپورٹ، اور آپ کے ایپلیکیشن کوڈ کے ساتھ بہتر انٹیگریشن پیش کرتا ہے، جبکہ curl فوری اور ہاک ٹیسٹنگ اور اسکرپٹنگ میں بہتر ہے۔
جواب: Go defer resp.Body.Close() کا استعمال کرتا ہے تاکہ یہ یقینی بنایا جا سکے کہ وسائل مناسب طریقے سے آزاد کیے جائیں، یہاں تک کہ اگر فنکشن میں بعد میں غلطیاں پیش آتی ہیں۔ یہ پیٹرن Go میں عام ہے اور وسائل کے نقصان کو روکتا ہے جو اس صورت میں ہو سکتا ہے اگر آپ تمام ممکنہ کوڈ پاتھس میں باڈی کو بند کرنا بھول جائیں۔
جواب: ioutil.ReadAll()
کا استعمال کرنے کے بجائے، آپ io.Copy()
کا استعمال کرکے یا چنکس کو بفر کے ساتھ پڑھ کر ریسپانس باڈی کو سٹریم کے طور پر پروسیس کر سکتے ہیں۔ یہ خاص طور پر بڑے ریسپانسز کے لیے مفید ہے جہاں پوری باڈی کو میموری میں لوڈ کرنا ناکارآمد ہوگا۔
جواب: ہاں، اور یہ تجویز کیا جاتا ہے! ایک واحد http.Client
بنانا اور اسے ریکویسٹس کے درمیان دوبارہ استعمال کرنا کنکشن پولنگ کی اجازت دیتا ہے اور کارکردگی کو بہتر بناتا ہے۔ کلائنٹ کنکرنسی-محفوظ ہے اور اضافی سنکرونائزیشن کے بغیر گوروٹینز کے درمیان شیئر کیا جا سکتا ہے۔
جواب: Go کا کنٹیکسٹ پیکیج خوبصورت ریکویسٹ کینسلیشن فراہم کرتا ہے۔ context.WithCancel()
یا context.WithTimeout()
کے ساتھ ایک کنٹیکسٹ بنائیں، پھر اسے http.NewRequestWithContext()
کو پاس کریں۔ آپ کینسل فنکشن کو کال کرکے کسی بھی وقت ریکویسٹ کو کینسل کر سکتے ہیں۔
جواب: TLS سرٹیفکیٹ ویریفیکیشن کو چھوڑنے کے لیے (curl کے -k فلیگ کی طرح)، اپنے HTTP کلائنٹ میں ایک کسٹم ٹرانسپورٹ کنفیگر کریں: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}}
تاہم، یہ صرف ٹیسٹنگ کے لیے استعمال کیا جانا چاہیے، کیونکہ یہ سیکیورٹی چیکس کو بائی پاس کرتا ہے۔
جواب: Go کا HTTP کلائنٹ خودکار طور پر ریڈائریکٹس کی پیروی کرتا ہے (ڈیفالٹ طور پر 10 تک)، curl کی طرح۔ اس رویے کو کسٹمائز کرنے کے لیے، ریڈائریکٹ ہینڈلنگ کو کنٹرول کرنے یا ریڈائریکٹس کو مکمل طور پر روکنے کے لیے اپنے HTTP کلائنٹ میں ایک کسٹم CheckRedirect
فنکشن سیٹ کریں۔
curl کمانڈز کو سمجھنا موثر Go API ٹیسٹنگ کے لیے ضروری ہے۔ یہاں ہمارے کنورٹر کے ذریعے سپورٹ کردہ عام curl آپشنز کا ایک فوری حوالہ ہے:
curl [options] [URL]
-X, --request METHOD
: Specify request method (GET, POST, PUT, DELETE, etc.)-H, --header LINE
: Add header to the request-d, --data DATA
: Send data in POST request-F, --form CONTENT
: Submit form data-u, --user USER:PASSWORD
: Server user and password-k, --insecure
: Allow insecure server connections-I, --head
: Show document info only-v, --verbose
: Make the operation more verbose-s, --silent
: Silent mode--connect-timeout SECONDS
: Maximum time for connectionہمارا Go کنورٹر متعدد ہیڈرز، اتھنٹیکیشن، ڈیٹا پے لوڈز، اور مختلف آپشنز سمیت پیچیدہ curl کمانڈز کو سنبھالتا ہے۔ بس اپنی curl کمانڈ پیسٹ کریں اور net/http پیکیج کا استعمال کرتے ہوئے صاف، جدید Go کوڈ حاصل کریں۔
Go کے net/http پیکیج کے ساتھ کام کرتے وقت، موثر اور محفوظ API انٹریکشنز کے لیے ان بہترین طریقوں پر عمل کریں:
resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() // Important: prevents resource leaks
client := &http.Client{ Timeout: 10 * time.Second, Transport: &http.Transport{ MaxIdleConns: 100, MaxIdleConnsPerHost: 20, IdleConnTimeout: 90 * time.Second, }, } resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return }
resp, err := client.Do(req) if err != nil { var netErr net.Error if errors.As(err, &netErr) && netErr.Timeout() { fmt.Println("Request timed out") } else if errors.Is(err, context.DeadlineExceeded) { fmt.Println("Context deadline exceeded") } else { fmt.Println("Error sending request:", err) } return } defer resp.Body.Close() // Check status code if resp.StatusCode < 200 || resp.StatusCode >= 300 { body, _ := ioutil.ReadAll(resp.Body) fmt.Printf("Error status: %d %s\n", resp.StatusCode, resp.Status) fmt.Printf("Response body: %s\n", string(body)) return } // Read response body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response body:", err) return } // Process response data var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { fmt.Println("Error parsing JSON:", err) fmt.Println("Raw response:", string(body)) return }
// Create context with timeout ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // Important: prevents context leaks // Create request with context req, err := http.NewRequestWithContext(ctx, "GET", "https://api.example.com/data", nil) if err != nil { fmt.Println("Error creating request:", err) return } // Send request resp, err := client.Do(req) // Error handling...
// Define request and response structs type User struct { ID int `json:"id,omitempty"` Name string `json:"name"` Email string `json:"email"` } // Create request data user := User{ Name: "John Doe", Email: "[email protected]", } // Serialize to JSON jsonData, err := json.Marshal(user) if err != nil { fmt.Println("Error marshaling JSON:", err) return } // Create request req, err := http.NewRequest("POST", "https://api.example.com/users", bytes.NewBuffer(jsonData)) // Set headers, send request, etc... // Deserialize response var responseUser User if err := json.Unmarshal(body, &responseUser); err != nil { fmt.Println("Error parsing JSON response:", err) return } fmt.Printf("Created user with ID: %d\n", responseUser.ID)