Curl کو Go میں تبدیل کرنے والا

curl کمانڈز کو Go کوڈ میں تبدیل کریں - API ریکویسٹس کے لیے استعمال کے لیے تیار Go net/http کوڈ تیار کریں

رازداری کا نوٹس: یہ پروفیشنل ٹول انٹرپرائز گریڈ رازداری کے تحفظ کے ساتھ Go کوڈ میں محفوظ تبدیلی فراہم کرتا ہے۔ ہم آپ کے جمع کردہ کسی بھی ڈیٹا کو ذخیرہ نہیں کرتے، جس سے آپ کے API ڈویلپمنٹ کام کی مکمل رازداری یقینی بنتی ہے۔

Go کوڈ جنریٹر

// 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))
}

Go API ٹیسٹنگ کے لیے عام curl کمانڈز

یہاں کچھ عام curl کمانڈز ہیں جنہیں آپ Go کوڈ میں تبدیل کر سکتے ہیں:

Go HTTP مثالیں

Go کا net/http پیکیج HTTP ریکویسٹس بنانے کا ایک طاقتور اور موثر طریقہ فراہم کرتا ہے۔ یہاں کچھ عام Go HTTP پیٹرنز ہیں:

Go کے ساتھ فائل اپلوڈ

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))
}

ٹائم آؤٹ اور ایرر ہینڈلنگ کے ساتھ Go HTTP

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)
}

Go کوڈ کنورٹر کا استعمال کیسے کریں

1. بنیادی استعمال

اپنی curl کمانڈ کاپی کریں → ان پٹ باکس میں پیسٹ کریں → فوری طور پر Go کوڈ حاصل کریں

2. مناسب ایرر ہینڈلنگ کو نافذ کریں

// 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
}

3. ٹائم آؤٹس کے لیے کنٹیکسٹ کا استعمال کریں

// 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
}

Go HTTP ریکویسٹس کے بارے میں اکثر پوچھے گئے سوالات

سوال: Go کا HTTP کلائنٹ curl سے کیسے مختلف ہے؟

جواب: جبکہ curl HTTP ریکویسٹس بنانے کے لیے ایک کمانڈ لائن ٹول ہے، Go کا net/http پیکیج ایک پروگراماٹک API فراہم کرتا ہے۔ Go مضبوط ٹائپنگ، بلٹ-ان کنکرنسی سپورٹ، اور آپ کے ایپلیکیشن کوڈ کے ساتھ بہتر انٹیگریشن پیش کرتا ہے، جبکہ curl فوری اور ہاک ٹیسٹنگ اور اسکرپٹنگ میں بہتر ہے۔

سوال: Go ریسپانس باڈیز کو بند کرنے کے لیے defer کیوں استعمال کرتا ہے؟

جواب: Go defer resp.Body.Close() کا استعمال کرتا ہے تاکہ یہ یقینی بنایا جا سکے کہ وسائل مناسب طریقے سے آزاد کیے جائیں، یہاں تک کہ اگر فنکشن میں بعد میں غلطیاں پیش آتی ہیں۔ یہ پیٹرن Go میں عام ہے اور وسائل کے نقصان کو روکتا ہے جو اس صورت میں ہو سکتا ہے اگر آپ تمام ممکنہ کوڈ پاتھس میں باڈی کو بند کرنا بھول جائیں۔

سوال: میں Go میں سٹریمنگ ریسپانسز کو کیسے ہینڈل کروں؟

جواب: ioutil.ReadAll() کا استعمال کرنے کے بجائے، آپ io.Copy() کا استعمال کرکے یا چنکس کو بفر کے ساتھ پڑھ کر ریسپانس باڈی کو سٹریم کے طور پر پروسیس کر سکتے ہیں۔ یہ خاص طور پر بڑے ریسپانسز کے لیے مفید ہے جہاں پوری باڈی کو میموری میں لوڈ کرنا ناکارآمد ہوگا۔

سوال: کیا میں Go میں HTTP کلائنٹس کو دوبارہ استعمال کر سکتا ہوں؟

جواب: ہاں، اور یہ تجویز کیا جاتا ہے! ایک واحد http.Client بنانا اور اسے ریکویسٹس کے درمیان دوبارہ استعمال کرنا کنکشن پولنگ کی اجازت دیتا ہے اور کارکردگی کو بہتر بناتا ہے۔ کلائنٹ کنکرنسی-محفوظ ہے اور اضافی سنکرونائزیشن کے بغیر گوروٹینز کے درمیان شیئر کیا جا سکتا ہے۔

سوال: میں Go میں ریکویسٹ کینسلیشن کو کیسے نافذ کروں؟

جواب: Go کا کنٹیکسٹ پیکیج خوبصورت ریکویسٹ کینسلیشن فراہم کرتا ہے۔ context.WithCancel() یا context.WithTimeout() کے ساتھ ایک کنٹیکسٹ بنائیں، پھر اسے http.NewRequestWithContext() کو پاس کریں۔ آپ کینسل فنکشن کو کال کرکے کسی بھی وقت ریکویسٹ کو کینسل کر سکتے ہیں۔

سوال: Go میں curl کے -k/--insecure فلیگ کا متبادل کیا ہے؟

جواب: TLS سرٹیفکیٹ ویریفیکیشن کو چھوڑنے کے لیے (curl کے -k فلیگ کی طرح)، اپنے HTTP کلائنٹ میں ایک کسٹم ٹرانسپورٹ کنفیگر کریں: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} تاہم، یہ صرف ٹیسٹنگ کے لیے استعمال کیا جانا چاہیے، کیونکہ یہ سیکیورٹی چیکس کو بائی پاس کرتا ہے۔

سوال: میں Go میں ریڈائریکٹس کو curl کے مقابلے میں کیسے سنبھالوں؟

جواب: Go کا HTTP کلائنٹ خودکار طور پر ریڈائریکٹس کی پیروی کرتا ہے (ڈیفالٹ طور پر 10 تک)، curl کی طرح۔ اس رویے کو کسٹمائز کرنے کے لیے، ریڈائریکٹ ہینڈلنگ کو کنٹرول کرنے یا ریڈائریکٹس کو مکمل طور پر روکنے کے لیے اپنے HTTP کلائنٹ میں ایک کسٹم CheckRedirect فنکشن سیٹ کریں۔

Go API ٹیسٹنگ کے لیے Curl کمانڈ حوالہ

curl کمانڈز کو سمجھنا موثر Go API ٹیسٹنگ کے لیے ضروری ہے۔ یہاں ہمارے کنورٹر کے ذریعے سپورٹ کردہ عام curl آپشنز کا ایک فوری حوالہ ہے:

بنیادی curl سنٹیکس

curl [options] [URL]

عام curl آپشنز

پیچیدہ curl کمانڈز کو تبدیل کرنا

ہمارا Go کنورٹر متعدد ہیڈرز، اتھنٹیکیشن، ڈیٹا پے لوڈز، اور مختلف آپشنز سمیت پیچیدہ curl کمانڈز کو سنبھالتا ہے۔ بس اپنی curl کمانڈ پیسٹ کریں اور net/http پیکیج کا استعمال کرتے ہوئے صاف، جدید Go کوڈ حاصل کریں۔

Go HTTP بہترین طریقے

Go کے net/http پیکیج کے ساتھ کام کرتے وقت، موثر اور محفوظ API انٹریکشنز کے لیے ان بہترین طریقوں پر عمل کریں:

1. ہمیشہ ریسپانس باڈی کو بند کریں

resp, err := client.Do(req)
if err != nil {
	fmt.Println("Error sending request:", err)
	return
}
defer resp.Body.Close() // Important: prevents resource leaks

2. کسٹم HTTP کلائنٹ کا استعمال کریں

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
}

3. جامع ایرر ہینڈلنگ کو نافذ کریں

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
}

4. ٹائم آؤٹ اور کینسلیشن کنٹرول کے لیے کنٹیکسٹ کا استعمال کریں

// 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...

5. JSON سیریلائزیشن اور ڈیسیریلائزیشن کے لیے سٹرکٹس کا استعمال کریں

// 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)