PoradnikiSamouczki

Kursy walut w Go przez net/http

Zbuduj typowanego klienta Go z net/http, timeoutem, kluczem z otoczenia i polami świeżości, aby pobierać kursy walut z exchangerate.dev.

8 wrz 2026 · 6 min czytania

Biblioteka standardowa Go wystarczy. Sprawdź status HTTP przed dekodowaniem i zachowaj źródło, sesję rynku oraz czas aktualizacji.

  • Zbuduj klienta: net/http, context i encoding/json pobierają wiele walut w jednym żądaniu. Bearer dodaj tylko, gdy istnieje EXCHANGERATE_API_KEY.
  • Wywołaj z timeoutem: context.WithTimeout zabezpiecza worker przed zawieszonym połączeniem. W produkcji używaj współdzielonego http.Client.
  • Obsłuż błędy i świeżość: 401 oznacza błąd klucza, a 429 zbyt duży ruch. Zachowaj source, market_session i data_updated_at; nie ujawniaj klucza w kliencie.

Zbuduj klienta

net/http, context i encoding/json pobierają wiele walut w jednym żądaniu. Bearer dodaj tylko, gdy istnieje EXCHANGERATE_API_KEY.

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

Wywołaj z timeoutem

shell · run main.go
go run main.go

Obsłuż błędy i świeżość

401 oznacza błąd klucza, a 429 zbyt duży ruch. Zachowaj source, market_session i data_updated_at; nie ujawniaj klucza w kliencie.

Zachowaj kontekst kursu

Raport dzienny potrzebuje jednego wywołania, a dashboard może działać co godzinę. Po 429 zmniejsz częstotliwość zamiast tworzyć pętlę ponowień.

  • Zapisuj kurs ze źródłem i czasem.
  • Używaj go w automatyzacji i analizie.
  • Nie traktuj go jako ceny wykonawczej.

Pytania

Czy potrzebuję SDK?

Nie, wystarczą pakiety standardowe Go.

Gdzie trzymać klucz?

W EXCHANGERATE_API_KEY na serwerze.

Czy kurs służy do rozliczeń?

Nie, to dane orientacyjne do aplikacji i analiz.

Co zrobić po 429?

Zmniejsz częstotliwość, nie ponawiaj natychmiast i przestrzegaj limitu planu.

Czytaj dalej

Zacznij od bezpłatnego klucza API

5 000 zapytań miesięcznie w bezpłatnym planie. Bez karty kredytowej.

Uzyskaj bezpłatny klucz