Penukar Curl kepada Go

Tukar arahan curl kepada kod Go - Jana kod Go net/http sedia untuk digunakan untuk permintaan API

Notis Privasi: Alat profesional ini menyediakan penukaran selamat kepada kod Go dengan perlindungan privasi gred perusahaan. Kami tidak menyimpan sebarang data yang anda hantar, memastikan kerahsiaan lengkap untuk kerja pembangunan API anda.

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

Arahan curl Biasa untuk Ujian API Go

Berikut adalah beberapa arahan curl biasa yang boleh anda tukar kepada kod Go:

Contoh HTTP Go

Pakej net/http Go menyediakan cara yang berkuasa dan cekap untuk membuat permintaan HTTP. Berikut adalah beberapa corak HTTP Go yang biasa:

Muat Naik Fail dengan 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 dengan Masa Tamat dan Pengendalian Ralat

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

Cara Menggunakan Penukar Kod Go

1. Penggunaan Asas

Salin arahan curl anda → Tampal ke dalam kotak input → Dapatkan kod Go dengan segera

2. Laksanakan Pengendalian Ralat yang Betul

// 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. Gunakan Context untuk Masa Tamat

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

Soalan Lazim tentang Permintaan HTTP Go

S: Bagaimana klien HTTP Go berbeza daripada curl?

J: Sementara curl adalah alat baris arahan untuk membuat permintaan HTTP, pakej net/http Go menyediakan API programatik. Go menawarkan pengetikan yang lebih kuat, sokongan keserentakan bawaan, dan integrasi yang lebih baik dengan kod aplikasi anda, manakala curl cemerlang dalam pengujian ad-hoc dan skrip yang cepat.

S: Mengapa Go menggunakan defer untuk menutup badan respons?

J: Go menggunakan defer resp.Body.Close() untuk memastikan sumber dilepaskan dengan betul walaupun ralat berlaku kemudian dalam fungsi. Corak ini adalah idiomatik dalam Go dan mencegah kebocoran sumber yang boleh berlaku jika anda lupa untuk menutup badan dalam semua laluan kod yang mungkin.

S: Bagaimana saya mengendalikan respons penstriman dalam Go?

J: Selain menggunakan ioutil.ReadAll(), anda boleh memproses badan respons sebagai aliran menggunakan io.Copy() atau dengan membaca cebisan dengan penimbal. Ini sangat berguna untuk respons besar di mana memuatkan seluruh badan ke dalam memori akan tidak cekap.

S: Bolehkah saya menggunakan semula klien HTTP dalam Go?

J: Ya, dan ia disyorkan! Mencipta satu http.Client dan menggunakannya semula merentasi permintaan membolehkan pengumpulan sambungan dan meningkatkan prestasi. Klien ini selamat keserentakan dan boleh dikongsi antara goroutines tanpa penyelarasan tambahan.

S: Bagaimana saya melaksanakan pembatalan permintaan dalam Go?

J: Pakej context Go menyediakan pembatalan permintaan yang elegan. Cipta konteks dengan context.WithCancel() atau context.WithTimeout(), kemudian luluskannya kepada http.NewRequestWithContext(). Anda boleh membatalkan permintaan pada bila-bila masa dengan memanggil fungsi batal.

S: Apakah persamaan bendera -k/--insecure curl dalam Go?

J: Untuk melangkau pengesahan sijil TLS (seperti bendera -k curl), konfigurasikan Transport tersuai dalam klien HTTP anda: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} Walau bagaimanapun, ini hanya boleh digunakan untuk ujian, kerana ia memintas pemeriksaan keselamatan.

S: Bagaimana saya mengendalikan pengalihan dalam Go berbanding dengan curl?

J: Klien HTTP Go mengikuti pengalihan secara automatik (sehingga 10 secara lalai), sama seperti curl. Untuk menyesuaikan tingkah laku ini, tetapkan fungsi CheckRedirect tersuai dalam klien HTTP anda untuk mengawal pengendalian pengalihan atau menghalang pengalihan sepenuhnya.

Rujukan Arahan Curl untuk Ujian API Go

Memahami arahan curl adalah penting untuk ujian API Go yang berkesan. Berikut adalah rujukan pantas pilihan curl biasa yang disokong oleh penukar kami:

Sintaks curl Asas

curl [options] [URL]

Pilihan curl Biasa

Menukar Arahan curl Kompleks

Penukar Go kami mengendalikan arahan curl kompleks termasuk pelbagai pengepala, pengesahan, muatan data, dan pelbagai pilihan. Hanya tampal arahan curl anda dan dapatkan kod Go yang bersih dan moden menggunakan pakej net/http.

Amalan Terbaik HTTP Go

Apabila bekerja dengan pakej net/http Go, ikuti amalan terbaik ini untuk interaksi API yang cekap dan selamat:

1. Sentiasa Tutup Badan Respons

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

2. Gunakan Klien HTTP Tersuai

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. Laksanakan Pengendalian Ralat Komprehensif

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. Gunakan Context untuk Kawalan Masa Tamat dan Pembatalan

// 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. Gunakan Structs untuk Pengserialan dan Penyahserialan 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)