Curl'dan Go'ya Dönüştürücü

Curl komutlarını Go koduna dönüştürün - API istekleri için kullanıma hazır Go net/http kodu oluşturun

Gizlilik Bildirimi: Bu profesyonel araç, kurumsal düzeyde gizlilik koruması ile Go koduna güvenli dönüşüm sağlar. Gönderdiğiniz hiçbir veriyi saklamıyoruz, API geliştirme çalışmalarınız için tam gizlilik sağlıyoruz.

Go Kod Üreteci

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

Go API Testi için Yaygın Curl Komutları

İşte Go koduna dönüştürebileceğiniz bazı yaygın curl komutları:

Go HTTP Örnekleri

Go'nun net/http paketi, HTTP istekleri yapmak için güçlü ve verimli bir yol sağlar. İşte bazı yaygın Go HTTP kalıpları:

Dosya Yükleme ile 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))
}

Zaman Aşımı ve Hata İşleme ile Go HTTP

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

Go Kod Dönüştürücüsü Nasıl Kullanılır

1. Temel Kullanım

Curl komutunuzu kopyalayın → Giriş kutusuna yapıştırın → Anında Go kodu alın

2. Uygun Hata İşleme Uygulayın

// 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. Zaman Aşımları için Context Kullanın

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

Go HTTP İstekleri Hakkında Sık Sorulan Sorular

S: Go'nun HTTP istemcisi curl'dan nasıl farklıdır?

C: Curl HTTP istekleri yapmak için bir komut satırı aracı iken, Go'nun net/http paketi programatik bir API sağlar. Go daha güçlü tipleme, yerleşik eşzamanlılık desteği ve uygulama kodunuzla daha iyi entegrasyon sunarken, curl hızlı geçici testlerde ve betik oluşturmada öne çıkar.

S: Go neden yanıt gövdelerini kapatmak için defer kullanır?

C: Go, fonksiyonda daha sonra hatalar oluşsa bile kaynakların düzgün şekilde serbest bırakılmasını sağlamak için defer resp.Body.Close() kullanır. Bu kalıp Go'da yaygındır ve tüm olası kod yollarında gövdeyi kapatmayı unutursanız oluşabilecek kaynak sızıntılarını önler.

S: Go'da akış yanıtlarını nasıl işlerim?

C: ioutil.ReadAll() kullanmak yerine, io.Copy() kullanarak veya bir tamponla parçalar okuyarak yanıt gövdesini bir akış olarak işleyebilirsiniz. Bu, tüm gövdeyi belleğe yüklemenin verimsiz olacağı büyük yanıtlar için özellikle kullanışlıdır.

S: Go'da HTTP istemcilerini yeniden kullanabilir miyim?

C: Evet, ve bu önerilir! Tek bir http.Client oluşturmak ve istekler arasında yeniden kullanmak, bağlantı havuzuna izin verir ve performansı artırır. İstemci eşzamanlılık açısından güvenlidir ve ek senkronizasyon olmadan goroutine'ler arasında paylaşılabilir.

S: Go'da istek iptali nasıl uygulanır?

C: Go'nun context paketi zarif istek iptali sağlar. context.WithCancel() veya context.WithTimeout() ile bir context oluşturun, ardından http.NewRequestWithContext()'e aktarın. İptal fonksiyonunu çağırarak isteği istediğiniz zaman iptal edebilirsiniz.

S: Go'da curl'un -k/--insecure bayrağının eşdeğeri nedir?

C: TLS sertifika doğrulamasını atlamak için (curl'un -k bayrağı gibi), HTTP istemcinizde özel bir Transport yapılandırın: client := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}} Ancak bu, güvenlik kontrollerini atladığı için yalnızca test için kullanılmalıdır.

S: Go'da curl'a kıyasla yönlendirmeleri nasıl işlerim?

C: Go'nun HTTP istemcisi, curl'a benzer şekilde yönlendirmeleri otomatik olarak takip eder (varsayılan olarak 10'a kadar). Bu davranışı özelleştirmek için, yönlendirme işlemesini kontrol etmek veya yönlendirmeleri tamamen önlemek için HTTP istemcinizde özel bir CheckRedirect fonksiyonu ayarlayın.

Go API Testi için Curl Komut Referansı

Curl komutlarını anlamak, etkili Go API testi için gereklidir. İşte dönüştürücümüzün desteklediği yaygın curl seçeneklerinin hızlı bir referansı:

Temel curl Sözdizimi

curl [options] [URL]

Yaygın curl Seçenekleri

Karmaşık curl Komutlarını Dönüştürme

Go dönüştürücümüz, birden fazla başlık, kimlik doğrulama, veri yükleri ve çeşitli seçenekler dahil karmaşık curl komutlarını işler. Curl komutunuzu yapıştırmanız yeterlidir ve net/http paketini kullanan temiz, modern Go kodu alın.

Go HTTP En İyi Uygulamaları

Go'nun net/http paketi ile çalışırken, verimli ve güvenli API etkileşimleri için bu en iyi uygulamaları izleyin:

1. Her Zaman Yanıt Gövdesini Kapatın

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

2. Özel HTTP İstemcisi Kullanın

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. Kapsamlı Hata İşleme Uygulayın

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. Zaman Aşımı ve İptal Kontrolü için Context Kullanın

// 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. JSON Serileştirme ve Deserileştirme için Struct Kullanın

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