Převodník Curl na Go

Převeďte příkazy curl na kód Go - Generujte připravený k použití kód Go net/http pro API požadavky

Oznámení o ochraně soukromí: Tento profesionální nástroj poskytuje bezpečnou konverzi do kódu Go s ochranou soukromí na podnikové úrovni. Neukládáme žádná data, která odešlete, což zajišťuje úplnou důvěrnost pro vaši práci na vývoji API.

Generátor Go kódu

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

Běžné příkazy curl pro testování API v Go

Zde jsou některé běžné příkazy curl, které můžete převést na kód Go:

Příklady HTTP v Go

Balíček net/http v Go poskytuje výkonný a efektivní způsob, jak provádět HTTP požadavky. Zde jsou některé běžné vzory HTTP v Go:

Nahrávání souborů v 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 s časovým limitem a zpracováním chyb

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

Jak používat převodník kódu Go

1. Základní použití

Zkopírujte svůj příkaz curl → Vložte do vstupního pole → Získejte kód Go okamžitě

2. Implementujte správné zpracování chyb

// 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. Použijte Context pro časové limity

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

Často kladené otázky o HTTP požadavcích v Go

Otázka: Jak se HTTP klient Go liší od curl?

Odpověď: Zatímco curl je nástroj příkazového řádku pro provádění HTTP požadavků, balíček net/http v Go poskytuje programové API. Go nabízí silnější typování, vestavěnou podporu souběžnosti a lepší integraci s vaším aplikačním kódem, zatímco curl vyniká v rychlém ad-hoc testování a skriptování.

Otázka: Proč Go používá defer pro uzavírání těl odpovědí?

Odpověď: Go používá defer resp.Body.Close() k zajištění správného uvolnění zdrojů, i když se později ve funkci vyskytnou chyby. Tento vzor je idiomatický v Go a zabraňuje únikům zdrojů, které by mohly nastat, pokud byste zapomněli uzavřít tělo ve všech možných cestách kódu.

Otázka: Jak zpracovávám streamované odpovědi v Go?

Odpověď: Místo použití ioutil.ReadAll() můžete zpracovat tělo odpovědi jako stream pomocí io.Copy() nebo čtením částí s vyrovnávací pamětí. To je zvláště užitečné pro velké odpovědi, kde by načtení celého těla do paměti bylo neefektivní.

Otázka: Mohu znovu použít HTTP klienty v Go?

Odpověď: Ano, a je to doporučeno! Vytvoření jednoho http.Client a jeho opětovné použití napříč požadavky umožňuje sdílení připojení a zlepšuje výkon. Klient je bezpečný pro souběžnost a může být sdílen mezi gorutinami bez dodatečné synchronizace.

Otázka: Jak implementuji zrušení požadavku v Go?

Odpověď: Balíček context v Go poskytuje elegantní zrušení požadavku. Vytvořte kontext pomocí context.WithCancel() nebo context.WithTimeout(), poté jej předejte do http.NewRequestWithContext(). Požadavek můžete kdykoli zrušit voláním funkce cancel.

Otázka: Jaký je ekvivalent příznaku curl -k/--insecure v Go?

Odpověď: Pro přeskočení ověření TLS certifikátu (jako příznak curl -k) nakonfigurujte vlastní Transport ve vašem HTTP klientovi: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} Toto by však mělo být použito pouze pro testování, protože to obchází bezpečnostní kontroly.

Otázka: Jak zpracovávám přesměrování v Go ve srovnání s curl?

Odpověď: HTTP klient Go automaticky sleduje přesměrování (ve výchozím nastavení až 10), podobně jako curl. Pro přizpůsobení tohoto chování nastavte vlastní funkci CheckRedirect ve vašem HTTP klientovi pro kontrolu zpracování přesměrování nebo úplné zabránění přesměrování.

Reference příkazů Curl pro testování API v Go

Porozumění příkazům curl je nezbytné pro efektivní testování API v Go. Zde je rychlý přehled běžných možností curl, které náš převodník podporuje:

Základní syntaxe curl

curl [options] [URL]

Běžné možnosti curl

Převod složitých příkazů curl

Náš převodník Go zpracovává složité příkazy curl včetně více hlaviček, autentizace, datových užitečných zatížení a různých možností. Jednoduše vložte svůj příkaz curl a získejte čistý, moderní Go kód používající balíček net/http.

Osvědčené postupy pro HTTP v Go

Při práci s balíčkem Go net/http dodržujte tyto osvědčené postupy pro efektivní a bezpečné interakce s API:

1. Vždy zavírejte tělo odpovědi

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

2. Používejte vlastní 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. Implementujte komplexní zpracování chyb

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. Používejte Context pro kontrolu časového limitu a zrušení

// 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. Používejte struktury pro serializaci a deserializaci 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)