class MX::Banxico::WebServices::WebService

Modelo para conectarse al servicio web de Banxico por medio de Savon::Model.

@note Savon crea métodos por omisión de acuerdo a las operaciones soportadas por el servicio web, tano a nivel

de clase como de instancia.

Constants

CODIFICACION_WS

Codificación de la petición y respuesta del servicio ¡guácala, no es UTF-8 la codificación que manejan en Banxico!

OPERACIONES_WS

Operaciones soportadas por el servicio web de Banxico:

  • Reservas internacionales

  • Tasas de interés

  • Tipos de Cambio

  • UDIS

Respuesta

Estructura para guardar el cuerpo de la respuesta de una operación o los errores

WSDL

URL con la definición del servicio web.

Public Class Methods

init_client() click to toggle source

Inicializa el cliente de Savon.

# File lib/MX/Banxico/web_services/web_service.rb, line 59
def self.init_client
  client wsdl: WSDL, encoding: CODIFICACION_WS, open_timeout: 5, read_timeout: 5
end
operaciones() click to toggle source

Arreglo con las operaciones soportadas por el servicio web.

@return [Array] un arreglo con las operaciones soportados.

# File lib/MX/Banxico/web_services/web_service.rb, line 95
def self.operaciones
  OPERACIONES_WS
end

Public Instance Methods

realizar_operacion(op, intentos = 5) click to toggle source

Realiza la operación solicitada en un máximo de intentos dados.

@param op [Symbol] el nombre de la operación soportada a efectuarse. Ver {OPERACIONES_WS}. @param intentos [Fixnum] el número de intentos en los que se tratará de recuperar la respuesta de la operación.

@return [Hash] con el cuerpo de la respuesta de la operación en la llave `:cuerpo` o una descripción de los errores

ocurridos  en la llave `:errores`.
# File lib/MX/Banxico/web_services/web_service.rb, line 75
def realizar_operacion(op, intentos = 5)
  raise ArgumentError.new("La operación #{op} no está soportada.") unless OPERACIONES_WS.member?(op.to_sym)
  raise ArgumentError.new("El número de intentos debe ser mayor o igual a 1.") if (!intentos.is_a?(Integer) or intentos < 1)
  errores = ""
  1.upto(intentos) do |intento|
    begin
      resp = client.call(op.to_sym)
      return Respuesta.new(resp.body[:"#{op}_response"][:result]) if resp.success?
    rescue Exception => e
      errores = "#{errores}Intento #{intento}: #{e.message}. "
    end
    errores = "#{errores}Número de intentos agotados #{intentos}." if intento == intentos
  end
  Respuesta.new(nil, errores)
end