شرح عملي/واجهة أسعار الصرف لـ Ruby on Rails واجهة أسعار الصرف لـ Ruby on Rails
واجهة أسعار الصرف لـ Ruby on Rails. دليل عملي يتضمن الشفرة والتخزين المؤقت وبيانات الحداثة.
نفّذ التكامل على الخادم دون كشف بيانات الاعتماد، واحتفظ بالمصدر ووقت الرصد.
نقاط أساسية
احتفظ بمفتاح API على الخادم. تحقق من رموز العملات والمبالغ. خزّن الاستجابات الناجحة مؤقتًا. الخطوة 1
مثال برمجيcopy
require "net/http"
require "json"
class ExchangeRateClient
Error = Class.new(StandardError)
def convert(from:, to:, amount:)
from = from.to_s.upcase
to = to.to_s.upcase
raise Error, "invalid currency code" unless [from, to].all? { |code| code.match?(/A[A-Z]{3}z/) }
key = ["fx-convert", from, to, amount.to_d.to_s("F")]
Rails.cache.fetch(key, expires_in: 60.seconds) do
uri = URI("https://api.exchangerate.dev/v1/convert/#{from}/#{to}/#{amount}")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("EXCHANGERATE_API_KEY")}"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true,
open_timeout: 2, read_timeout: 5) { |http| http.request(request) }
raise Error, "exchange-rate API returned #{response.code}" unless response.is_a?(Net::HTTPSuccess)
JSON.parse(response.body)
end
rescue Net::OpenTimeout, Net::ReadTimeout => error
raise Error, "exchange-rate API timed out: #{error.class}"
end
endالخطوة 2
مثال برمجيcopy
class ConversionsController < ApplicationController
def show
amount = BigDecimal(params.require(:amount))
result = ExchangeRateClient.new.convert(
from: params.require(:from).upcase,
to: params.require(:to).upcase,
amount: amount
)
render json: result.slice("from", "to", "amount", "rate", "converted",
"source", "market_session", "data_updated_at")
rescue ExchangeRateClient::Error, ArgumentError => error
render json: { error: error.message }, status: :bad_gateway
end
endالخطوة 3
نفّذ هذا النمط على الخادم، وتحقق من المدخلات، واحتفظ ببيانات الاستجابة.
الخطوة 4
نفّذ هذا النمط على الخادم، وتحقق من المدخلات، واحتفظ ببيانات الاستجابة.
دليل
هذه أسعار إرشادية وليست أسعار تسوية.