الأدلةدروس

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

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

8 سبتمبر 2026 · قراءة خلال 6 دقائق

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

  • أنشئ عميلاً 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.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"])}

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

shell · run main.go
go run main.go

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

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

احفظ سياق السعر

استخدم استدعاءً يومياً للتقارير أو كل ساعة للوحة تشغيلية. عند 429 خفّض الجدول ولا تنشئ حلقة إعادة محاولة فورية.

  • احفظ السعر مع المصدر والوقت.
  • استخدمه للأتمتة والتقدير والتحليل.
  • لا تتعامل معه كسعر قابل للتنفيذ.

أسئلة

هل أحتاج إلى SDK؟

لا، تكفي حزم Go القياسية.

أين أضع المفتاح؟

في EXCHANGERATE_API_KEY على الخادم، وليس في الشيفرة.

هل يصلح للتسوية؟

لا، هذه بيانات إرشادية للتطبيقات والتقديرات والتقارير والتحليل.

ماذا أفعل بعد 429؟

خفّض الجدول وتجنب الإعادة الفورية والتزم بحدود الباقة.

تابع القراءة

ابدأ بمفتاح API مجاني

5,000 طلب شهريًا ضمن الخطة المجانية. لا حاجة إلى بطاقة ائتمان.

احصل على مفتاح مجاني