class Correios::Frete::WebService

Constants

CONDITIONS
FORMATS
URL

Public Class Methods

new(frete, service_types) click to toggle source
# File lib/correios/frete/web_service.rb, line 12
def initialize(frete, service_types)
  @url = "#{URL}?#{params_for(frete, service_types)}"
end

Public Instance Methods

request!() click to toggle source
# File lib/correios/frete/web_service.rb, line 16
def request!
  response = with_log { http_request(@url) }
  response.body
end

Private Instance Methods

format_decimal(value) click to toggle source
# File lib/correios/frete/web_service.rb, line 50
def format_decimal(value)
  value.to_s.gsub(".", ",")
end
format_headers_for(http) click to toggle source
# File lib/correios/frete/web_service.rb, line 77
def format_headers_for(http)
  # I'm using an empty block in each_header method for Ruby 1.8.7 compatibility.
  http.each_header{}.map { |name, values| "#{name}: #{values.first}" }.join("\n")
end
format_request_message() click to toggle source
# File lib/correios/frete/web_service.rb, line 65
def format_request_message
  message =  with_line_break { "Correios-Frete Request:" }
  message << with_line_break { "GET #{@url}" }
end
format_response_message(response) click to toggle source
# File lib/correios/frete/web_service.rb, line 70
def format_response_message(response)
  message =  with_line_break { "Correios-Frete Response:" }
  message << with_line_break { "HTTP/#{response.http_version} #{response.code} #{response.message}" }
  message << with_line_break { format_headers_for(response) } if Correios::Frete.log_level == :debug
  message << with_line_break { response.body }
end
http_request(url) click to toggle source
# File lib/correios/frete/web_service.rb, line 23
def http_request(url)
  uri = URI.parse(url)
  request = Net::HTTP::Get.new(uri.request_uri)

  http = Net::HTTP.new(uri.host, uri.port)
  http.open_timeout = Correios::Frete.request_timeout
  http.request(request)
end
params_for(frete, service_types) click to toggle source
# File lib/correios/frete/web_service.rb, line 32
def params_for(frete, service_types)
  "sCepOrigem=#{frete.cep_origem}&" +
  "sCepDestino=#{frete.cep_destino}&" +
  "nVlPeso=#{frete.peso}&" +
  "nVlComprimento=#{format_decimal(frete.comprimento)}&" +
  "nVlLargura=#{format_decimal(frete.largura)}&" +
  "nVlAltura=#{format_decimal(frete.altura)}&" +
  "nVlDiametro=#{format_decimal(frete.diametro)}&" +
  "nCdFormato=#{FORMATS[frete.formato]}&" +
  "sCdMaoPropria=#{CONDITIONS[frete.mao_propria]}&" +
  "sCdAvisoRecebimento=#{CONDITIONS[frete.aviso_recebimento]}&" +
  "nVlValorDeclarado=#{format_decimal(format("%.2f" % frete.valor_declarado))}&" +
  "nCdServico=#{service_codes_for(service_types)}&" +
  "nCdEmpresa=#{frete.codigo_empresa}&" +
  "sDsSenha=#{frete.senha}&" +
  "StrRetorno=xml"
end
service_codes_for(service_types) click to toggle source
# File lib/correios/frete/web_service.rb, line 54
def service_codes_for(service_types)
  service_types.map { |type| Correios::Frete::Servico.code_from_type(type) }.join(",")
end
with_line_break() click to toggle source
# File lib/correios/frete/web_service.rb, line 82
def with_line_break
  "#{yield}\n"
end
with_log() { || ... } click to toggle source
# File lib/correios/frete/web_service.rb, line 58
def with_log
  Correios::Frete.log format_request_message
  response = yield
  Correios::Frete.log format_response_message(response)
  response
end