Implementa esta integración en el servidor sin exponer credenciales y conserva la fuente y la hora de observación.
- Mantén la clave API en el servidor.
- Valida códigos de moneda e importes.
- Almacena en caché las respuestas correctas.
- Muestra la fuente y la hora de observación.
Paso 1
Ejemplo de código
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}" endendPaso 2
Ejemplo de código
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 endendPaso 3
Ejecuta este patrón en el servidor, valida las entradas y conserva los metadatos de la respuesta.
Paso 4
Ejecuta este patrón en el servidor, valida las entradas y conserva los metadatos de la respuesta.
Guía
Estos tipos son indicativos y no son precios de liquidación.