Konverter Curl ke Go

Konversi perintah curl ke kode Go - Hasilkan kode Go net/http siap pakai untuk permintaan API

Pemberitahuan Privasi: Alat profesional ini menyediakan konversi aman ke kode Go dengan perlindungan privasi tingkat perusahaan. Kami tidak menyimpan data apa pun yang Anda kirimkan, memastikan kerahasiaan lengkap untuk pekerjaan pengembangan API Anda.

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

Perintah curl Umum untuk Pengujian API Go

Berikut adalah beberapa perintah curl umum yang dapat Anda konversi ke kode Go:

Contoh HTTP Go

Paket net/http Go menyediakan cara yang kuat dan efisien untuk membuat permintaan HTTP. Berikut adalah beberapa pola HTTP Go yang umum:

Unggah File 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 Timeout dan Penanganan Kesalahan

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 Konverter Kode Go

1. Penggunaan Dasar

Salin perintah curl Anda → Tempel ke kotak input → Dapatkan kode Go secara instan

2. Implementasikan Penanganan Kesalahan yang Tepat

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

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

Pertanyaan Umum tentang Permintaan HTTP Go

T: Bagaimana klien HTTP Go berbeda dari curl?

J: Sementara curl adalah alat command-line untuk membuat permintaan HTTP, paket net/http Go menyediakan API terprogram. Go menawarkan pengetikan yang lebih kuat, dukungan konkurensi bawaan, dan integrasi yang lebih baik dengan kode aplikasi Anda, sedangkan curl unggul dalam pengujian ad-hoc cepat dan skripting.

T: Mengapa Go menggunakan defer untuk menutup body respons?

J: Go menggunakan defer resp.Body.Close() untuk memastikan sumber daya dilepaskan dengan benar bahkan jika terjadi kesalahan kemudian dalam fungsi. Pola ini adalah idiomatik di Go dan mencegah kebocoran sumber daya yang bisa terjadi jika Anda lupa menutup body di semua jalur kode yang mungkin.

T: Bagaimana cara menangani respons streaming di Go?

J: Alih-alih menggunakan ioutil.ReadAll(), Anda dapat memproses body respons sebagai stream menggunakan io.Copy() atau dengan membaca potongan dengan buffer. Ini sangat berguna untuk respons besar di mana memuat seluruh body ke memori akan tidak efisien.

T: Bisakah saya menggunakan kembali klien HTTP di Go?

J: Ya, dan itu direkomendasikan! Membuat satu http.Client dan menggunakannya kembali di seluruh permintaan memungkinkan pooling koneksi dan meningkatkan kinerja. Klien ini aman untuk konkurensi dan dapat dibagikan antar goroutine tanpa sinkronisasi tambahan.

T: Bagaimana cara mengimplementasikan pembatalan permintaan di Go?

J: Paket context Go menyediakan pembatalan permintaan yang elegan. Buat konteks dengan context.WithCancel() atau context.WithTimeout(), kemudian teruskan ke http.NewRequestWithContext(). Anda dapat membatalkan permintaan kapan saja dengan memanggil fungsi cancel.

T: Apa yang setara dengan flag -k/--insecure curl di Go?

J: Untuk melewati verifikasi sertifikat TLS (seperti flag -k curl), konfigurasikan Transport kustom di klien HTTP Anda: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} Namun, ini hanya boleh digunakan untuk pengujian, karena melewati pemeriksaan keamanan.

T: Bagaimana cara menangani pengalihan di Go dibandingkan dengan curl?

J: Klien HTTP Go mengikuti pengalihan secara otomatis (hingga 10 secara default), mirip dengan curl. Untuk menyesuaikan perilaku ini, tetapkan fungsi CheckRedirect kustom di klien HTTP Anda untuk mengontrol penanganan pengalihan atau mencegah pengalihan sepenuhnya.

Referensi Perintah Curl untuk Pengujian API Go

Memahami perintah curl sangat penting untuk pengujian API Go yang efektif. Berikut adalah referensi cepat opsi curl umum yang didukung konverter kami:

Sintaks curl Dasar

curl [options] [URL]

Opsi curl Umum

Mengkonversi Perintah curl Kompleks

Konverter Go kami menangani perintah curl kompleks termasuk beberapa header, autentikasi, muatan data, dan berbagai opsi. Cukup tempel perintah curl Anda dan dapatkan kode Go yang bersih dan modern menggunakan paket net/http.

Praktik Terbaik HTTP Go

Saat bekerja dengan paket net/http Go, ikuti praktik terbaik ini untuk interaksi API yang efisien dan aman:

1. Selalu Tutup Body 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 Kustom

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. Implementasikan Penanganan Kesalahan 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 Kontrol Timeout 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 Struct untuk Serialisasi dan Deserialisasi 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)