searchForCeps method
- required String uf,
- required String cidade,
- required String logradouro,
- SearchCepsType returnType = SearchCepsType.json,
Envia uma request GET para a API do via_cep enviando uma String com uf
uma String com cidade e outra com endereço. É possivel especificar o
tipo de retorno através da enumeração ReturnType
, podendo para este
método ser json ou xml. Se não escolhido nenhum tipo de retorno o default
será json.
Existem necessidades, por exemplo um cadastramento online onde o cliente desconhece o CEP da sua rua e será necessário realizar uma pesquisa para verificar a existência de um CEP que corresponda ao endereço. Para consultar um CEP na base de dados são necessários três parâmetros obrigatórios (UF, Cidade e Logradouro), sendo que para Cidade e Logradouro também é obrigatório um número mínimo de três caracteres a fim de evitar resultados muito abrangentes.
O resultado será ordenado pela proximidade do nome do logradouro e possui limite máximo de 50 (cinquenta) CEPs. Desta forma, quanto mais específico os parâmentros de entrada maior será a precisão do resultado.
O resultado será uma List de objetos CepInfo
.
Ex: uf = 'RS' cidade = 'Porto Alegre' endereco = 'Domingos'
uf = 'RS' cidade = 'Porto Alegre' endereco = 'Domingos Jose'
uf = 'RS' cidade = 'Porto Alegre' endereco = 'Domingos+Jose'
Os exemplos acima demonstram diferentes formar de pesquisar pelas ocorrências "Domingos" e "José" na cidade de "Porto Algre/RS".
Quando o nome da cidade ou do logradouro não contiver ao menos três caracteres uma exceção será lançada.
Implementation
Future<Either<SearchCepError, List<ViaCepInfo>>> searchForCeps({
required String uf,
required String cidade,
required String logradouro,
SearchCepsType returnType = SearchCepsType.json,
}) async {
try {
final type = getTypeSearchCeps(returnType);
final uri = Uri.parse('$baseUrl/$uf/$cidade/$logradouro/$type');
final response = await _client.get(uri);
if (response.statusCode == ok) {
switch (returnType) {
case SearchCepsType.json:
final listInfo = jsonDecode(response.body) as List;
return right(List.generate(
listInfo.length,
(i) =>
ViaCepInfo.fromJson(listInfo[i] as Map<String, dynamic>)));
case SearchCepsType.xml:
return right(ViaCepInfo.toListXml(response.body));
}
}
return left(const InvalidFormatError(
'Nome da cidade e logradouro tem que ter ao menos três caracteres'));
} on Exception {
return left(const NetworkError());
}
}