searchForCeps method

Future<Either<SearchCepError, List<ViaCepInfo>>> searchForCeps({
  1. required String uf,
  2. required String cidade,
  3. required String logradouro,
  4. 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());
  }
}