Skip to content

Instantly share code, notes, and snippets.

@hugomaiavieira
Created May 17, 2016 20:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hugomaiavieira/4ecb45335bb87a8df614e86bf6ec23a1 to your computer and use it in GitHub Desktop.
Save hugomaiavieira/4ecb45335bb87a8df614e86bf6ec23a1 to your computer and use it in GitHub Desktop.
require 'httparty'
# Este recurso tem como finalidade encontrar um endereço através de um CEP, e
# para isso ele utiliza o web service da Via Cep (http://viacep.com.br/)
# Obviamente, para utilizar este serviço é necessário uma conexão com a Internet.
#
# Como fazer a busca de endereço por cep?
#
# AddressFinder.cep(28053040)
# AddressFinder.cep('28053040')
# AddressFinder.cep('28053-040')
# AddressFinder.cep('28.053-040')
#
# {
# "cep": "01001-000",
# "logradouro": "Praça da Sé",
# "complemento": "lado ímpar",
# "bairro": "Sé",
# "localidade": "São Paulo",
# "uf": "SP",
# "ibge": "3550308"
# }
#
# É feita uma validação para ver se o cep possui 8 caracteres após a remoção de '.' e '-'.
# AddressFinder.cep('0000000') ==> RuntimeError 'O CEP informado possui um formato inválido.'
#
class AddressFinder
WEB_SERVICE_AVISO_URL = 'http://viacep.com.br/ws/'
# Retorna um hash com os dados de endereçamento para o cep informado ou
# um erro quando o serviço está indisponível, quando o cep informado possui
# um formato inválido ou quando o endereço não foi encontrado.
#
# Exemplo:
# AddressFinder.cep(28053040) ==>
# {
# "cep": "01001-000",
# "logradouro": "Praça da Sé",
# "complemento": "lado ímpar",
# "bairro": "Sé",
# "localidade": "São Paulo",
# "uf": "SP",
# "ibge": "3550308"
# }
def self.cep(numero)
cep = numero.to_s.gsub(/[\.-]/, '')
raise "O CEP informado possui um formato inválido." unless cep.to_s.match(/^\d{8}$/)
url = "#{WEB_SERVICE_AVISO_URL}#{cep}/json"
begin
response = HTTParty.send :get, url, { timeout: 1.5 }
rescue Net::OpenTimeout
raise "A busca de endereço por CEP está indisponível. Tente novamente."
end
begin
result = symbolize_keys(JSON.parse(response.body))
raise "CEP #{cep} não encontrado." if result[:erro].present?
result
rescue JSON::ParserError
raise "CEP #{cep} não encontrado."
end
end
private
def self.symbolize_keys(hash)
hash.each_with_object({}) { |(key,value), _hash| _hash[key.to_sym] = value }
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment