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
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
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
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