Curl naar Go Converter

Converteer curl-opdrachten naar Go-code - Genereer direct bruikbare Go net/http-code voor API-verzoeken

Privacymelding: Deze professionele tool biedt veilige conversie naar Go-code met privacy-bescherming van enterprise-niveau. We slaan geen gegevens op die u indient, waardoor volledige vertrouwelijkheid voor uw API-ontwikkelingswerk wordt gegarandeerd.

Go Code Generator

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

Veelvoorkomende curl-opdrachten voor Go API-testen

Hier zijn enkele veelvoorkomende curl-opdrachten die u naar Go-code kunt converteren:

Go HTTP-voorbeelden

Go's net/http-pakket biedt een krachtige en efficiënte manier om HTTP-verzoeken te doen. Hier zijn enkele veelvoorkomende Go HTTP-patronen:

Bestandsupload met 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 met Timeout en Foutafhandeling

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

Hoe de Go Code Converter te gebruiken

1. Basisgebruik

Kopieer uw curl-opdracht → Plak in het invoerveld → Krijg direct Go-code

2. Implementeer Juiste Foutafhandeling

// 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. Gebruik Context voor 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
}

Veelgestelde vragen over Go HTTP-verzoeken

V: Hoe verschilt Go's HTTP-client van curl?

A: Terwijl curl een opdrachtregeltool is voor het maken van HTTP-verzoeken, biedt Go's net/http-pakket een programmatische API. Go biedt sterkere typering, ingebouwde ondersteuning voor gelijktijdigheid en betere integratie met uw applicatiecode, terwijl curl uitblinkt in snelle ad-hoc tests en scripting.

V: Waarom gebruikt Go defer voor het sluiten van response bodies?

A: Go gebruikt defer resp.Body.Close() om ervoor te zorgen dat bronnen correct worden vrijgegeven, zelfs als er later in de functie fouten optreden. Dit patroon is idiomatisch in Go en voorkomt resourcelekken die zouden kunnen optreden als u vergeet de body in alle mogelijke codepaden te sluiten.

V: Hoe verwerk ik streaming responses in Go?

A: In plaats van ioutil.ReadAll() te gebruiken, kunt u de response body als een stream verwerken met io.Copy() of door chunks te lezen met een buffer. Dit is vooral handig voor grote responses waarbij het laden van de hele body in het geheugen inefficiënt zou zijn.

V: Kan ik HTTP-clients hergebruiken in Go?

A: Ja, en het wordt aanbevolen! Het creëren van een enkele http.Client en het hergebruiken ervan voor meerdere verzoeken maakt connection pooling mogelijk en verbetert de prestaties. De client is thread-safe en kan worden gedeeld tussen goroutines zonder extra synchronisatie.

V: Hoe implementeer ik request-annulering in Go?

A: Go's context-pakket biedt elegante request-annulering. Maak een context met context.WithCancel() of context.WithTimeout(), en geef deze vervolgens door aan http.NewRequestWithContext(). U kunt het verzoek op elk moment annuleren door de cancel-functie aan te roepen.

V: Wat is het equivalent van curl's -k/--insecure vlag in Go?

A: Om TLS-certificaatverificatie over te slaan (zoals curl's -k vlag), configureert u een aangepaste Transport in uw HTTP-client: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} Dit moet echter alleen voor testen worden gebruikt, omdat het beveiligingscontroles omzeilt.

V: Hoe verwerk ik redirects in Go vergeleken met curl?

A: Go's HTTP-client volgt automatisch redirects (standaard tot 10), vergelijkbaar met curl. Om dit gedrag aan te passen, stelt u een aangepaste CheckRedirect-functie in uw HTTP-client in om redirect-afhandeling te beheren of redirects volledig te voorkomen.

Curl-opdrachtverwijzing voor Go API-testen

Het begrijpen van curl-opdrachten is essentieel voor effectief Go API-testen. Hier is een snelle referentie van veelvoorkomende curl-opties die onze converter ondersteunt:

Basis curl-syntaxis

curl [options] [URL]

Veelvoorkomende curl-opties

Complexe curl-opdrachten converteren

Onze Go-converter verwerkt complexe curl-opdrachten, inclusief meerdere headers, authenticatie, data payloads en verschillende opties. Plak simpelweg uw curl-opdracht en krijg schone, moderne Go-code met het net/http-pakket.

Go HTTP Best Practices

Volg bij het werken met Go's net/http-pakket deze best practices voor efficiënte en veilige API-interacties:

1. Sluit altijd Response Body

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

2. Gebruik aangepaste HTTP-client

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. Implementeer uitgebreide foutafhandeling

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. Gebruik Context voor Timeout- en Annuleringscontrole

// 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. Gebruik Structs voor JSON-serialisatie en -deserialisatie

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