Tutorial/بداية سريعة مع Go

جلب أسعار الصرف في Go باستخدام net/http

أنشئ عميلاً typed في Go باستخدام net/http والمهلات والمصادقة من البيئة وحقول الحداثة.

ERexchangerate.dev·Sep 8, 2026·قراءة خلال 6 دقائق

تكفي مكتبة Go القياسية لتكامل موثوق. افحص حالة HTTP قبل فك JSON، واحتفظ بالمصدر وجلسة السوق ووقت التحديث مع السعر.

Key points
أنشئ عميلاً typed: يستخدم المثال net/http وcontext وencoding/json ويطلب عدة عملات معاً. أضف Bearer فقط عند وجود EXCHANGERATE_API_KEY.
استخدم مهلة للطلب: تمنع context.WithTimeout اتصالاً عالقاً من احتجاز عامل إلى أجل غير مسمى. أعد استخدام http.Client في الإنتاج.
عالج الأخطاء والحداثة: يتطلب 401 إصلاح المفتاح، بينما يتطلب 429 خفض الحركة. احتفظ بـ source وmarket_session وdata_updated_at ولا تكشف المفتاح في المتصفح أو الهاتف.

أنشئ عميلاً typed

يستخدم المثال net/http وcontext وencoding/json ويطلب عدة عملات معاً. أضف Bearer فقط عند وجود EXCHANGERATE_API_KEY.

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

استخدم مهلة للطلب

shell · run main.gocopy
go run main.go

عالج الأخطاء والحداثة

يتطلب 401 إصلاح المفتاح، بينما يتطلب 429 خفض الحركة. احتفظ بـ source وmarket_session وdata_updated_at ولا تكشف المفتاح في المتصفح أو الهاتف.

احفظ سياق السعر
استخدم استدعاءً يومياً للتقارير أو كل ساعة للوحة تشغيلية. عند 429 خفّض الجدول ولا تنشئ حلقة إعادة محاولة فورية.
  • احفظ السعر مع المصدر والوقت.
  • استخدمه للأتمتة والتقدير والتحليل.
  • لا تتعامل معه كسعر قابل للتنفيذ.
ER
exchangerate.dev
أدلة تكامل للمطورين.

تابع القراءة

Referenceالبدء السريع لواجهة الأسعاراقرأ TutorialPythonاقرأ Referencesource / market_sessionاقرأ
المزيد من المقارناتFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
تعلّمReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youأسعار الصرف المرجعية للبنك المركزي الأوروبي، موضحة
أسعار مباشرةEUR/USDGBP/USDUSD/JPY