RehberlerEğitimler

Go net/http ile döviz kurlarını alma

net/http, timeout, ortam değişkeni kimlik doğrulaması ve güncellik alanlarıyla tipli bir Go istemcisi oluşturun.

8 Eyl 2026 · 6 dk okuma

Güvenilir entegrasyon için Go standart kütüphanesi yeterlidir. JSON çözümlemeden HTTP durumunu kontrol edin ve kaynak ile güncelleme zamanını saklayın.

  • Tipli istemci oluşturun: net/http, context ve encoding/json ile tek istekte birden fazla para birimi alın. Bearer başlığını yalnızca EXCHANGERATE_API_KEY varsa ekleyin.
  • Timeout ile çağırın: context.WithTimeout takılan bağlantıların workerı kilitlemesini önler. Üretimde paylaşılan bir http.Client kullanın.
  • Hata ve güncelliği yönetin: 401 anahtar düzeltmeyi, 429 ise trafiği azaltmayı gerektirir. source, market_session ve data_updated_at alanlarını koruyun; anahtarı istemciye koymayın.

Tipli istemci oluşturun

net/http, context ve encoding/json ile tek istekte birden fazla para birimi alın. Bearer başlığını yalnızca EXCHANGERATE_API_KEY varsa ekleyin.

go · main.go
package mainimport (  "context"  "encoding/json"  "fmt"  "net/http"  "log"  "os"  "regexp"  "strings"  "time")type Latest struct {  Base          string             `json:"base"`  Source        string             `json:"source"`  MarketSession string             `json:"market_session"`  UpdatedAt     time.Time          `json:"data_updated_at"`  Sources       map[string]string  `json:"sources"`  EffectiveAt   map[string]string  `json:"effective_at"`  Rates         map[string]json.Number `json:"rates"`}func LatestRates(ctx context.Context, base string) (Latest, error) {  base = strings.ToUpper(base)  if !regexp.MustCompile("^[A-Z]{3}$").MatchString(base) {    return Latest{}, fmt.Errorf("invalid base currency: %q", base)  }  url := "https://api.exchangerate.dev/v1/latest/" + base + "?symbols=EUR,GBP,JPY"  req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)  if err != nil { return Latest{}, err }  if key := os.Getenv("EXCHANGERATE_API_KEY"); key != "" {    req.Header.Set("Authorization", "Bearer "+key)  }  client := &http.Client{Timeout: 5 * time.Second, CheckRedirect: func(_ *http.Request, _ []*http.Request) error {    return http.ErrUseLastResponse  }}  res, err := client.Do(req)  if err != nil { return Latest{}, err }  defer res.Body.Close()  if res.StatusCode < 200 || res.StatusCode >= 300 {    return Latest{}, fmt.Errorf("exchange rate API: HTTP %s", res.Status)  }  var out Latest  if err := json.NewDecoder(res.Body).Decode(&out); err != nil { return Latest{}, err }  return out, nil}func main() {  ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)  defer cancel()  latest, err := LatestRates(ctx, "USD")  if err != nil { log.Fatal(err) }  fmt.Println(latest.Rates["EUR"], latest.Sources["EUR"], latest.EffectiveAt["EUR"])}

Timeout ile çağırın

shell · run main.go
go run main.go

Hata ve güncelliği yönetin

401 anahtar düzeltmeyi, 429 ise trafiği azaltmayı gerektirir. source, market_session ve data_updated_at alanlarını koruyun; anahtarı istemciye koymayın.

Kur bağlamını koruyun

Günlük rapor için günde bir, operasyon paneli için saatte bir çağrı yeterli olabilir. 429 sonrası hemen yeniden denemek yerine sıklığı azaltın.

  • Kuru kaynak ve zamanla birlikte saklayın.
  • Otomasyon ve analiz için kullanın.
  • Uygulanabilir fiyat gibi görmeyin.

Sorular

SDK gerekli mi?

Hayır, Go standart paketleri yeterlidir.

Anahtar nerede tutulmalı?

Sunucudaki EXCHANGERATE_API_KEY ortam değişkeninde.

Mutabakat için kullanılabilir mi?

Hayır, bunlar gösterge niteliğinde referans verilerdir.

429 sonrasında ne yapmalıyım?

Sıklığı azaltın, hemen yeniden denemeyin ve plan limitine uyun.

Okumaya devam edin

Ücretsiz bir API anahtarıyla başlayın

Ücretsiz planda ayda 5.000 istek. Kredi kartı gerekmez.

Ücretsiz anahtar alın