Created
May 17, 2016 20:11
-
-
Save hugomaiavieira/4ecb45335bb87a8df614e86bf6ec23a1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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