Convertisseur de Curl vers Go

Convertissez les commandes curl en code Go - Générez du code Go net/http prêt à l'emploi pour les requêtes API

Avis de Confidentialité : Cet outil professionnel fournit une conversion sécurisée en code Go avec une protection de la confidentialité de niveau entreprise. Nous ne stockons aucune donnée que vous soumettez, assurant une confidentialité complète pour votre travail de développement d'API.

Générateur de code 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))
}

Commandes curl Courantes pour les Tests d'API Go

Voici quelques commandes curl courantes que vous pouvez convertir en code Go :

Exemples HTTP Go

Le package net/http de Go fournit un moyen puissant et efficace de faire des requêtes HTTP. Voici quelques modèles HTTP Go courants :

Téléchargement de Fichier avec 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))
}

HTTP Go avec Timeout et Gestion d'Erreurs

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

Comment Utiliser le Convertisseur de Code Go

1. Utilisation de Base

Copiez votre commande curl → Collez-la dans la zone de saisie → Obtenez du code Go instantanément

2. Implémentez une Gestion d'Erreurs Appropriée

// 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. Utilisez Context pour les Timeouts

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

Questions Fréquemment Posées sur les Requêtes HTTP Go

Q : En quoi le client HTTP de Go diffère-t-il de curl ?

R : Alors que curl est un outil en ligne de commande pour faire des requêtes HTTP, le package net/http de Go fournit une API programmatique. Go offre un typage plus fort, un support de concurrence intégré et une meilleure intégration avec votre code d'application, tandis que curl excelle dans les tests ad hoc rapides et les scripts.

Q : Pourquoi Go utilise-t-il defer pour fermer les corps de réponse ?

R : Go utilise defer resp.Body.Close() pour garantir que les ressources sont correctement libérées même si des erreurs surviennent plus tard dans la fonction. Ce modèle est idiomatique en Go et empêche les fuites de ressources qui pourraient se produire si vous oubliez de fermer le corps dans tous les chemins de code possibles.

Q : Comment gérer les réponses en streaming en Go ?

R : Au lieu d'utiliser ioutil.ReadAll(), vous pouvez traiter le corps de la réponse comme un flux en utilisant io.Copy() ou en lisant des morceaux avec un tampon. C'est particulièrement utile pour les réponses volumineuses où charger l'intégralité du corps en mémoire serait inefficace.

Q : Puis-je réutiliser les clients HTTP en Go ?

R : Oui, et c'est recommandé ! Créer un seul http.Client et le réutiliser pour plusieurs requêtes permet le regroupement de connexions et améliore les performances. Le client est thread-safe et peut être partagé entre goroutines sans synchronisation supplémentaire.

Q : Comment implémenter l'annulation de requête en Go ?

R : Le package context de Go fournit une élégante annulation de requête. Créez un contexte avec context.WithCancel() ou context.WithTimeout(), puis passez-le à http.NewRequestWithContext(). Vous pouvez annuler la requête à tout moment en appelant la fonction d'annulation.

Q : Quel est l'équivalent du drapeau -k/--insecure de curl en Go ?

R : Pour ignorer la vérification du certificat TLS (comme le drapeau -k de curl), configurez un Transport personnalisé dans votre client HTTP : client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} Cependant, cela ne devrait être utilisé que pour les tests, car cela contourne les vérifications de sécurité.

Q : Comment gérer les redirections en Go par rapport à curl ?

R : Le client HTTP de Go suit automatiquement les redirections (jusqu'à 10 par défaut), similaire à curl. Pour personnaliser ce comportement, définissez une fonction CheckRedirect personnalisée dans votre client HTTP pour contrôler la gestion des redirections ou les empêcher entièrement.

Référence des Commandes Curl pour les Tests d'API Go

Comprendre les commandes curl est essentiel pour des tests d'API Go efficaces. Voici une référence rapide des options curl courantes que notre convertisseur prend en charge :

Syntaxe curl de Base

curl [options] [URL]

Options curl Courantes

Conversion de Commandes curl Complexes

Notre convertisseur Go gère des commandes curl complexes, y compris plusieurs en-têtes, l'authentification, les charges utiles de données et diverses options. Il suffit de coller votre commande curl et d'obtenir un code Go propre et moderne utilisant le package net/http.

Meilleures Pratiques HTTP Go

Lorsque vous travaillez avec le package net/http de Go, suivez ces meilleures pratiques pour des interactions API efficaces et sécurisées :

1. Toujours Fermer le Corps de la Réponse

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

2. Utiliser un Client HTTP Personnalisé

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. Implémenter une Gestion d'Erreurs Complète

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. Utiliser Context pour le Contrôle des Timeouts et des Annulations

// 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. Utiliser des Structs pour la Sérialisation et la Désérialisation 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)