Tutorial/Go hızlı başlangıç

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.

ERexchangerate.dev·Sep 8, 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.

Key points
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.gocopy
package main

import (
  "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.gocopy
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.
ER
exchangerate.dev
Geliştiriciler için entegrasyon rehberleri.

Okumaya devam edin

ReferenceKur API hızlı başlangıçOku TutorialPythonOku Referencesource / market_sessionOku
Daha Fazla KarşılaştırmaFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
ÖğrenReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
Canlı KurlarEUR/USDGBP/USDUSD/JPY