Curl til Go Converter

Konverter curl-kommandoer til Go-kode - Generer klar-til-brug Go net/http-kode til API-requests

Privatlivsmeddelelse: Dette professionelle værktøj giver sikker konvertering til Go-kode med privatlivsbeskyttelse af virksomhedskvalitet. Vi gemmer ikke nogen data, du indsender, hvilket sikrer fuldstændig fortrolighed for dit API-udviklingsarbejde.

Go Kodegenerator

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

Almindelige curl-kommandoer til Go API-test

Her er nogle almindelige curl-kommandoer, som du kan konvertere til Go-kode:

Go HTTP-eksempler

Go's net/http-pakke giver en kraftfuld og effektiv måde at foretage HTTP-requests på. Her er nogle almindelige Go HTTP-mønstre:

Filupload med 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 med timeout og fejlhåndtering

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

Sådan bruger du Go-kodekonverteren

1. Grundlæggende brug

Kopier din curl-kommando → Indsæt i inputfeltet → Få Go-kode øjeblikkeligt

2. Implementer korrekt fejlhåndtering

// 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. Brug Context til 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
}

Ofte stillede spørgsmål om Go HTTP-requests

Spørgsmål: Hvordan adskiller Go's HTTP-klient sig fra curl?

Svar: Mens curl er et kommandolinjeværktøj til at foretage HTTP-requests, giver Go's net/http-pakke et programmatisk API. Go tilbyder stærkere typning, indbygget samtidighedssupport og bedre integration med din applikationskode, mens curl udmærker sig ved hurtig ad hoc-test og scripting.

Spørgsmål: Hvorfor bruger Go defer til at lukke response bodies?

Svar: Go bruger defer resp.Body.Close() for at sikre, at ressourcer frigives korrekt, selv hvis der opstår fejl senere i funktionen. Dette mønster er idiomatisk i Go og forhindrer ressourcelækager, der kunne opstå, hvis du glemmer at lukke body i alle mulige kodestier.

Spørgsmål: Hvordan håndterer jeg streaming responses i Go?

Svar: I stedet for at bruge ioutil.ReadAll() kan du behandle response body som en stream ved hjælp af io.Copy() eller ved at læse chunks med en buffer. Dette er særligt nyttigt for store responses, hvor det ville være ineffektivt at indlæse hele body i hukommelsen.

Spørgsmål: Kan jeg genbruge HTTP-klienter i Go?

Svar: Ja, og det anbefales! Oprettelse af en enkelt http.Client og genbrug af den på tværs af requests muliggør connection pooling og forbedrer ydeevnen. Klienten er thread-safe og kan deles mellem goroutines uden yderligere synkronisering.

Spørgsmål: Hvordan implementerer jeg request-annullering i Go?

Svar: Go's context-pakke giver elegant request-annullering. Opret en context med context.WithCancel() eller context.WithTimeout(), og send den derefter til http.NewRequestWithContext(). Du kan annullere requesten når som helst ved at kalde cancel-funktionen.

Spørgsmål: Hvad er ækvivalenten til curl's -k/--insecure flag i Go?

Svar: For at springe TLS-certifikatverifikation over (ligesom curl's -k flag), konfigurer en brugerdefineret Transport i din HTTP-klient: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} Dette bør dog kun bruges til test, da det omgår sikkerhedskontroller.

Spørgsmål: Hvordan håndterer jeg omdirigeringer i Go sammenlignet med curl?

Svar: Go's HTTP-klient følger omdirigeringer automatisk (op til 10 som standard), ligesom curl. For at tilpasse denne adfærd, indstil en brugerdefineret CheckRedirect-funktion i din HTTP-klient for at kontrollere omdirigeringshåndtering eller forhindre omdirigeringer helt.

Curl-kommando reference til Go API-test

Forståelse af curl-kommandoer er afgørende for effektiv Go API-test. Her er en hurtig reference over almindelige curl-optioner, som vores konverter understøtter:

Grundlæggende curl-syntaks

curl [options] [URL]

Almindelige curl-optioner

Konvertering af komplekse curl-kommandoer

Vores Go-konverter håndterer komplekse curl-kommandoer, herunder flere headers, autentificering, data-payloads og forskellige optioner. Indsæt blot din curl-kommando og få ren, moderne Go-kode ved hjælp af net/http-pakken.

Go HTTP Best Practices

Når du arbejder med Go's net/http-pakke, følg disse best practices for effektive og sikre API-interaktioner:

1. Luk altid 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. Brug brugerdefineret HTTP-klient

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. Implementer omfattende fejlhåndtering

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. Brug Context til timeout- og annulleringskontrol

// 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. Brug Structs til JSON-serialisering og -deserialisering

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