Como Migrar do Endcorp para o Endereço BH e Endereço Externo¶
Visão Geral¶
Endereço Corporativo (Endcorp) é um serviço cujo objetivo foi padronizar a forma de consumir e pesquisar endereços entre os sistemas da Prefeitura Municipal de Belo Horizonte. Como premissa, este serviço estabeleceu a chave de endereço única e imutável (CodEndcorp). Essa chave representa um identificador único para o endereço independente dos estados que ele assuma dentro da base e das atualizações cadastrais da cidade. Além dessa estratégia, o Endcorp também visava baratear os custos de desenvolvimento de novos sistemas, eliminando deles a necessidade de manter um cadastro de endereços, tanto para endereços de Belo Horizonte quanto fora de Belo Horizonte.
O Endereço BH mantém algumas das premissas do Endcorp, contudo novas estratégias de negócio foram definidas:
- O Endereço BH contempla apenas endereços de Belo Horizonte (e os endereços a validar), uma vez que o Cadastro Técnico responsável pela manutenção de endereços só dispõe de capacidade para validar endereços de BH. A parte do Endcorp referente a endereços fora de Belo Horizonte não é contemplada pelo Endereço BH.
- Para atender essa necessidade foi disponibilizado um segundo serviço, o Endereço Externo, que cobre o cadastro e a pesquisa de endereços dos demais municípios brasileiros e estrangeiros (com exceção de BH).
- Os serviços passam a ser somente de leitura no caso do Endereço BH (com exceção da inclusão de endereço a validar), autenticados por OAuth2/Keycloak e paginados. O Endereço Externo também oferece escrita (inclusão, atualização e exclusão lógica de endereço fora de BH).
- O resultado do Endereço BH é retornado em formato GeoJSON, e não mais como array de objetos com wrappers. O Endereço Externo retorna objetos JSON com lista de resultados e totais de paginação.
Premissa para migração completa: para suprir totalmente as funcionalidades do Endcorp, os sistemas que precisarem de endereços de BH, endereços a validar e endereços fora de BH deverão integrar com os dois novos serviços:
| Serviço | Escopo | URL |
|---|---|---|
| Endereço BH | Endereços validados de BH, endereços a validar, complementos, regionais, territórios | https://enderecobh.pbh.gov.br |
| Endereço Externo | Endereços de municípios fora de BH (BR e exterior), municípios, UFs, países, DNE, escrita de endereço externo | https://endereco-externo.pbh.gov.br (Swagger) |
Neste documento serão detalhados os casos de uso similares, as diferenças de comportamento entre os serviços e as funcionalidades que não foram contempladas no Endereço BH — indicando, quando aplicável, o endereço correspondente no Endereço Externo.
Cobertura dos serviços — Endereço BH e Endereço Externo¶
Escopo de cada serviço¶
| Funcionalidade do Endcorp | Endereço BH | Endereço Externo |
|---|---|---|
Endereços validados de BH (enderecosvalidados) |
sim (GET /enderecos) |
não — o Endereço Externo não cobre BH |
Endereços a validar de BH (enderecosavalidar, incluirenderecoavalidar) |
sim (GET/POST /enderecos_validar) |
não |
| Complementos, regionais, territórios de BH | sim | não |
Endereços fora de BH (enderecoforabh) |
não | sim (GET /enderecos) |
Inclusão de endereço fora de BH (incluirenderecoforabh) |
não | sim (POST /enderecos) |
| Atualização / exclusão de endereço fora de BH | não | sim (PUT/DELETE /enderecos/{id} + histórico /enderecos/{id}/atualizacoes) |
| Municípios, UFs, países | não | sim (/municipios, /uf, /paises) |
| DNE (endereços, CEPs) | sim (GET /dnes) |
sim (/dne, /dne/cep[/{cep}]) |
| Logradouros e bairros | sim (base de BH) | sim (base nacional/exterior) |
Para suprir 100% das funcionalidades do Endcorp, o sistema consumidor precisa integrar os dois serviços — cada um com permissão própria concedida no Acesso PBH/SDM.
Equivalência dos endpoints do Endcorp no Endereço Externo¶
Mapeamento dos casos de uso do Endcorp que não são atendidos pelo Endereço BH
(documentação oficial de migração:
/documentacao/migracao/endcorp-enderecoexterno/
e OpenAPI do serviço):
| Serviço do Endcorp | Equivalente no Endereço Externo | Nível | Observação |
|---|---|---|---|
/service/enderecoforabh |
GET /enderecos |
parcial | Endcorp filtra por campos (nome_logr, numero, cep_informado); no Endereço Externo os filtros são q, cep, numero (ver exemplos abaixo) |
/service/incluirenderecoforabh |
POST /enderecos |
parcial | Corpo EnderecoDTO (sem geometria); exige id_sistema_origem e informar id ou valor textual de país/UF/município/logradouro/bairro/CEP |
/service/municipios |
GET /municipios, GET /municipios/{id} |
total | |
/service/ufs |
GET /uf, GET /uf/{id} |
total | |
/service/pais |
GET /paises, GET /paises/{id} |
total | |
/service/localidadedne |
GET /dne/cep[/{cep}] |
parcial | Confirmação de existência de CEP e logradouros do CEP (DNE dos Correios) |
/service/dne |
GET /dne, GET /dne/{id} |
parcial | O Endereço BH também atende via GET /dnes (passo 2) |
/service/registrarusoendereco, /service/registrardeusoendereco |
— | não atendido | Não existe no Endereço Externo |
/service/bairroslogradouros |
— | não atendido | Não existe no Endereço Externo |
Atenção: os identificadores (
id) do Endereço Externo pertencem à base própria do serviço (endereços externos, municípios, logradouros...) e não são ocod_endereco_corporativodo Endcorp nem oiddo Endereço BH. Cada serviço tem sua própria chave.
Acesso e formato das chamadas — Endereço Externo¶
| Endereço BH | Endereço Externo | |
|---|---|---|
| URL base (produção) | https://enderecobh.pbh.gov.br/api/v1/ |
https://endereco-externo.pbh.gov.br/ (paths na raiz, sem prefixo) |
| URL base (homologação) | https://enderecobh-hm.pbh.gov.br |
https://endereco-externo-hm.pbh.gov.br/ |
| Swagger | https://enderecobh.pbh.gov.br/v3/api-docs |
https://endereco-externo.pbh.gov.br/swagger-ui/index.html |
| Autenticação | OAuth2/OpenID Connect (Acesso PBH, realm PBH) — mesmo fluxo | Mesmo fluxo OAuth2/Acesso PBH (no ambiente de homologação o issuer é https://acesso-st.pbh.gov.br/auth/realms/PBH) |
| Formato de listagem | GeoJSON FeatureCollection (sem totais de paginação) |
{"resultados":[...], "total_resultados", "total_paginas", "pagina", "quantidade_pagina", "quantidade_resultados"} |
Padrão de quantidade |
5 (/enderecos, /enderecos_validar) e 50 (demais) |
10 (todos os recursos testados) |
pagina |
Opcional, inicia em 0 | Opcional na prática, inicia em 0 (o OpenAPI marca como obrigatório em alguns recursos) |
| Escrita | Somente POST /enderecos_validar |
POST/PUT/DELETE /enderecos (endereços fora de BH), /sistemas, /fonte-dados |
Requisição (mesmo padrão do Endereço BH):
GET /enderecos?cep=14620959&numero=351&pagina=0
Authorization: Bearer CONTEUDO_ACESS_TOKEN
Observações verificadas (homologação
endereco-externo-hm.pbh.gov.br):
- Sem token:
401com{"codigo":"SEG-401","mensagem":"Você precisa estar autenticado..."}. Apenas/healthcheckresponde sem autenticação.- Recurso inexistente:
404com{"codigo":"ME-003","mensagem":"...","data":"..."}. Valor inválido em{id}(ex.: texto):500com corpo texto plano (não JSON).- Valores com acento ou espaço devem ser percent-encoding UTF-8 (
Orlândia→Orl%C3%A2ndia); a requisição sem encoding é rejeitada pelo proxy com400 Bad request.- Filtro
nomeem/logradourosfaz igualdade exata com o nome completo (busca parcial retorna vazio); useqpara busca parcial. Em/municipioso filtronomefoi ignorado na verificação (retornou a listagem completa) — usarqouid_uf/sigla_uf.qe os filtroscep,numero,listar_desativados,ordenarde/enderecosforam verificados funcionando.- O Endereço Externo não retorna geometria/coordenadas no endereço.
- Produção (
endereco-externo.pbh.gov.br) estava em manutenção (HTTP503) no momento desta verificação; os dados acima foram validados em homologação.
Exemplos de chamadas ao Endereço Externo¶
| Caso de uso | Chamada (homologação) |
|---|---|
| Pesquisar endereço fora de BH por CEP e número | GET /enderecos?cep=14620959&numero=351&pagina=0 |
| Pesquisar endereço fora de BH por texto livre | GET /enderecos?q=Avenida%20Brasil%201000&pagina=0 |
| Consultar endereço externo por identificador | GET /enderecos/32388 |
| Listar municípios de uma UF | GET /municipios?id_uf=31&pagina=0&quantidade=2 |
| Listar UFs / países | GET /uf?pagina=0 · GET /paises?nome=Brasil&pagina=0 |
| Pesquisar logradouro por nome completo | GET /logradouros?nome=Alameda%20Jos%C3%A9%20Bonif%C3%A1cio%20de%20Andrada%20e%20Silva&pagina=0 |
| Pesquisar bairro por texto livre | GET /bairros?q=Santa%20Efigenia&pagina=0&quantidade=2 |
| Confirmar existência de CEP no DNE | GET /dne/cep/30130-000 (ou /dne/cep/30130000) |
| Listar endereços DNE | GET /dne?pagina=0&quantidade=1 |
| Incluir endereço fora de BH | POST /enderecos com corpo EnderecoDTO (id_sistema_origem obrigatório) |
Passo a passo¶
- Criação de usuário e permissões para acesso ao Endereço BH
- Validação dos casos de usos disponíveis no Endereço BH
- Alteração na implementação existente
Passo 1¶
Criação de usuário e permissões para acesso ao Endereço BH¶
Para acessar os serviços do Endereço BH é necessário um usuário, do tipo sistema, cadastrado no Acesso PBH.
Caso o sistema ainda não possua usuário, é necessário solicitar para a área responsável. Mais informações neste link ou no manual disponível em autorizacaodesistemas.pbh.gov.br
Solicitar concessão de permissão para que o usuário possa acessar os serviços do Endereço BH Mais informações
Endereço Externo: caso o sistema também necessite de endereços fora de BH, é preciso solicitar, separadamente, a permissão para os serviços do Endereço Externo — são serviços e permissões distintos, ainda que utilizem o mesmo usuário do Acesso PBH e o mesmo fluxo OAuth2.
Diferença em relação ao Endcorp: nas chamadas de leitura testadas, o Endcorp não exigia autenticação. As operações de escrita do Endcorp exigem os campos
autenticacao(id_josso,senha_josso,email_usuario,sigla_sistema) no corpo da requisição. No Endereço BH todas as operações exigemAccess Tokenno cabeçalho.
Passo 2¶
Validação dos casos de usos disponíveis no Endereço BH¶
Endpoints¶
É necessário identificar todos os casos de uso atualmente utilizados no Endcorp e verificar se os casos de uso disponíveis no Endereço BH atendem aos requisitos existentes. Para facilitar a migração, a tabela abaixo contém as equivalências entre os serviços.
Endereço base dos serviços do Endcorp¶
- Base de produção:
http://endcorp.pbh/endereco-corporativo/soa - Base de homologação:
http://endcorp-hm.pbh/endereco-corporativo/soa
Todos os serviços usam HTTP POST com corpo JSON no formato
{"parametros": { ... }} e retornam um array de objetos com wrapper nomeado
(por exemplo, {"enderecoValidado": { ... }}).
O caminho completo é a base acima mais o path do serviço. A maioria dos serviços fica sob
/service/, exceto /lougradouros e /tipologradouros.
Possíveis equivalências entre endpoints dos serviços¶
| Nível | Significado |
|---|---|
| total | atendido sem restrições relevantes no Endereço BH |
| parcial | atendido, mas com diferenças de comportamento (ver notas abaixo) |
| não atendido | sem equivalência no Endereço BH |
| Serviço do Endcorp | Equivalente no Endereço BH | Nível | Observação |
|---|---|---|---|
| /enderecosvalidados | GET /enderecos |
total | Sem paginação no Endcorp: retorno máximo de 100 (nota 3) |
| /enderecosavalidar | GET /enderecos_validar |
parcial | Retorno máximo de 50 no Endcorp (nota 3) |
| /enderecologradouro | GET /enderecos?id_logradouro={id} |
parcial | O filtro do Endcorp é aplicado sobre cod_logradouro (nota 5) |
| /enderecocodigo | GET /enderecos/{id} |
total | param_endereco = cod_endereco_corporativo = id (nota 2) |
| /enderecocompleto | GET /enderecos + GET /enderecos_validar |
parcial | Exige tipo_pesquisa; não cobre "fora de BH" (ver Endereço Externo) |
| /enderecoforabh | — | não atendido | Endereço BH cobre apenas BH (serviço testado retornou erro interno) → Endereço Externo GET /enderecos |
| /lougradouros | GET /logradouros, GET /logradouros/{id} |
parcial | id_logr não é aceito como filtro (nota 6) |
| /tipologradouros | GET /tipos_logradouro, GET /tipos_logradouro/{id} |
parcial | Sem filtro exato por sigla no Endereço BH (nota 4) |
| /bairros | GET /bairros_populares, GET /bairros_populares/{id} |
parcial | Bairro popular; há também /bairros_oficiais (nota 4) |
| /bairroslogradouros | — | não atendido | Derivação possível via GET /enderecos?id_logradouro={id} agrupando bairros |
| /regionais | GET /regionais, GET /regionais/{id} |
parcial | Sem filtro por id na coleção; usar /{id} (nota 4) |
| /territoriogestaocompartilhadas | campos id_territorio/sigla_territorio em GET /enderecos |
parcial | Não há recurso (coleção) de territórios; nome do território não é exposto |
| /complementosendereco | GET /complementos?id_endereco={cod_endcorp} |
total | Filtro cod_endereco → id_endereco (nota 2) |
| /complemento | filtros de GET /complementos |
parcial | Não há catálogo de complementos no Endereço BH |
| /tipocomplementos | — | não atendido | Sem catálogo de tipos de complemento (os campos aparecem em /complementos) |
| /incluircomplementoendereco | — | não atendido | Escrita; Endereço BH é somente leitura |
| /incluirenderecoavalidar | POST /enderecos_validar |
parcial | Entrada no Endereço BH é um GeoJSON (Feature + geometry); exige autenticação no Endcorp |
| /incluirenderecoforabh | — | não atendido | Escrita; fora do escopo do Endereço BH → Endereço Externo POST /enderecos |
| /registrarusoendereco | — | não atendido | Escrita (exige autenticacao no Endcorp); sem equivalência nos dois novos serviços |
| /registrardeusoendereco | — | não atendido | Escrita (exige autenticacao no Endcorp); sem equivalência nos dois novos serviços |
| /dne | GET /dnes |
total | Endereço BH pagina o resultado (nota 3) |
| /localidadedne | — | não atendido | /dnes não expõe a árvore de localidades DNE → Endereço Externo GET /dne/cep[/{cep}] |
| /municipios | — | não atendido | Endereço BH não expõe municípios → Endereço Externo GET /municipios |
| /ufs | — | não atendido | Endereço BH não expõe UFs → Endereço Externo GET /uf |
| /pais | — | não atendido | Endereço BH não expõe países → Endereço Externo GET /paises |
| /logradourooutrosnomes | GET /logradouros/{id} (outros_nomes) ou GET /logradouros?outro_nome= |
total |
Exemplos de possíveis equivalências¶
Os exemplos abaixo utilizam chamadas reais ao Endcorp (produção) e o recurso correspondente do
Endereço BH. q é a busca por texto livre e os demais parâmetros são filtros estruturados
(nota 1).
| Caso de uso | Exemplo Endcorp | Exemplo (Endereço BH / Externo) | Nível |
|---|---|---|---|
| Pesquisar endereço validado por logradouro e número | POST /service/enderecosvalidados {"parametros":{"logradouro_informado":"AFONSO PENA","numero_informado":1000,"tipo_pesquisa_logradouro":1}} |
GET /enderecos?nome_logradouro=AFONSO PENA&numero=1000 |
total |
| Pesquisar endereço por CEP e número | POST /service/enderecosvalidados {"parametros":{"cep_informado":30130010,"numero_informado":1000}} |
GET /enderecos?cep=30130010&numero=1000 |
total |
| Pesquisar endereço pelo código do endereço corporativo | POST /service/enderecocodigo {"parametros":{"param_endereco":713858}} |
GET /enderecos/713858 |
total (nota 2) |
| Pesquisar todas as portas de um logradouro | POST /service/enderecologradouro {"parametros":{"id_logradouro_informado":1259}} |
GET /enderecos?id_logradouro=1259 |
parcial (nota 5) |
| Pesquisar endereços a validar | POST /service/enderecosavalidar {"parametros":{"cep_informado":30130010}} |
GET /enderecos_validar?cep=30130010 |
parcial (nota 3) |
| Pesquisar complementos de um endereço | POST /service/complementosendereco {"parametros":{"cod_endereco":713858}} |
GET /complementos?id_endereco=713858 |
total |
| Pesquisar logradouros por nome | POST /lougradouros {"parametros":{"nome_logr":"AFONSO PENA"}} |
GET /logradouros?q=AFONSO PENA |
parcial (nota 4) |
| Pesquisar logradouro por identificador | POST /lougradouros {"parametros":{"id_logr":1259}} → Err005 |
GET /logradouros/1259 |
não atendido no Endcorp (nota 6) |
| Pesquisar tipo de logradouro por sigla | POST /tipologradouros {"parametros":{"sigla_tipoLog":"RUA"}} |
GET /tipos_logradouro?q=RUA |
parcial (nota 4) |
| Pesquisar bairro popular por nome | POST /service/bairros {"parametros":{"nome_bairro":"SANTA EFIGENIA"}} |
GET /bairros_populares?q=SANTA EFIGENIA |
parcial (nota 4) |
| Pesquisar bairro popular por identificador | POST /service/bairros {"parametros":{"id_bairro":141}} |
GET /bairros_populares/141 |
total |
| Pesquisar regional por nome | POST /service/regionais {"parametros":{"nome_regional":"NORTE"}} |
GET /regionais?q=NORTE |
parcial (nota 4) |
| Pesquisar endereço DNE por CEP | POST /service/dne {"parametros":{"cep_informado":30130010}} |
GET /dnes?cep=30130010 |
total |
| Pesquisar outros nomes de um logradouro | POST /service/logradourooutrosnomes {"parametros":{"id_logradouro":41643}} |
GET /logradouros/41643 (campo outros_nomes) |
total |
| Pesquisar por bairro popular + regional + CEP | POST /service/enderecosvalidados {"parametros":{"bairro_informado":"SANTA EFIGENIA","regional_informado":"CENTRO-SUL","cep_informado":30150320}} |
GET /enderecos?bairro_popular=Santa Efigênia&nome_regional=CENTRO-SUL&cep=30150320 |
total |
Pesquisar por faixa de números (maior_que/menor_que/num_aproximado) |
POST /service/enderecosvalidados {"parametros":{"cep_informado":30130010,"numero_informado":1000,"num_aproximado":50,"maior_que":1}} |
GET /enderecos?cep=30130010&numero_min=1050&numero_max=1150 |
parcial (nota 4) |
| Pesquisar endereço a validar por texto livre | — (somente campos individuais) | GET /enderecos_validar?q=rua dos caetes 100 |
novo no Endereço BH |
| Busca reversa (coordenada → endereço) | — | GET /enderecos/reverso?coordenadas=POINT(...)&raio=50 |
novo no Endereço BH |
Filtrar endereços por área (bbox/poligono) |
filtros coord_x_informado/coord_y_informado (semântica a validar) |
GET /enderecos?bbox=...&crs=EPSG4326 |
novo no Endereço BH |
| Pesquisar endereços fora de BH | POST /service/enderecoforabh {"parametros":{"nome_logr":"Brasil","numero":"1000"}} |
Externo: GET /enderecos?q=Avenida%20Brasil%201000&pagina=0 |
não atendido no EBH; parcial no Endereço Externo |
| Incluir endereço fora de BH | POST /service/incluirenderecoforabh |
Externo: POST /enderecos (corpo EnderecoDTO, exige id_sistema_origem) |
não atendido no EBH; parcial no Endereço Externo |
| Pesquisar municípios, UFs, país e localidades DNE | POST /service/municipios, /ufs, /pais, /localidadedne |
Externo: GET /municipios?id_uf=31&pagina=0, GET /uf, GET /paises?nome=Brasil, GET /dne/cep/30130-000 |
não atendido no EBH; total no Endereço Externo |
| Registrar uso / liberar uso de um endereço | POST /service/registrarusoendereco, /registrardeusoendereco |
— | não atendido (sem equivalência nos dois serviços) |
Nota 1¶
Equivalência entre os casos de uso¶
O Endcorp utiliza filtros por campo para realizar a busca por endereços. O usuário informa
individualmente cada campo que compõe o endereço (logradouro_informado, bairro_informado,
cep_informado, numero_informado, ...), cabendo ao Endcorp restringir o resultado da consulta
somente aos endereços que possuem todos os campos informados pelo usuário.
O Endereço BH oferece as duas formas de pesquisa:
- Filtros estruturados (
nome_logradouro,numero,cep,bairro_popular,id_logradouro,id_regional,id_territorio, ...) — equivalentes aos campos individuais do Endcorp, com semântica de filtro (AND entre os parâmetros informados). - Busca por texto livre (
q) — o usuário informa todos os termos em um único campo e o Endereço BH busca a presença desses termos em todos os campos do endereço.
Portanto, ao usar q, mesmo informando termos pertencentes a um determinado campo do endereço,
caso estes termos estejam presentes em outros campos, estes serão incluídos no resultado.
Ex.: se o termo pesquisado for "Rua Carmo" e também existir um bairro "Carmo", endereços desse bairro podem retornar nos resultados caso os demais termos da busca também tenham similaridade.
Recomendação de migração: quando o sistema atual monta a consulta campo a campo, migrar para
os filtros estruturados do Endereço BH (equivalência total). Use q apenas quando o
sistema deseja busca aproximada/ponderada.
Nota 2¶
Mudança no identificador da entidade Endereço¶
O campo cod_endereco_corporativo presente no Endcorp equivale ao id no Endereço BH,
para o objeto de endereço. Seguindo a convenção de mercado para serviços REST e modelos de dados,
convencionou-se que todas as chaves serão nomeadas como id nos objetos do Endereço BH.
Trata-se do mesmo valor (não há conversão de chave): o índice do Endereço BH é alimentado a
partir da coluna ENDERECO_CORPORATIVO.COD_ENDERECO_CORPORATIVO. Exemplo verificado em produção
para o endereço AMAROS, 172 - A:
- Endcorp
POST /service/enderecocodigo{"parametros":{"param_endereco":713858}}→{"enderecoCorporativo":{"enderecoPBH":{"logradouro":"AMAROS","numero":172,"letra":"A", ... }}} - Endereço BH
GET /enderecos/713858→{"type":"Feature","properties":{"id":713858, ...}}
No objeto de endereço também existe o atributo id_endereco_pbh, que equivale ao atributo id
do serviço Geocoder e corresponde à chave na tabela do cadastro técnico
(ENDERECO_PBH.ID_ENDERECO_PBH). Ele está presente para garantir a retrocompatibilidade e
facilitar a compatibilização entre os sistemas que utilizam a chave desta tabela.
mais informações abaixo
Recomendação: sistemas que já persistem cod_endereco_corporativo podem continuar
utilizando o mesmo valor (lendo o campo id do Endereço BH). Sistemas que ainda não adotaram a
chave devem passar a persistir id (= CodEndcorp) e, quando precisarem do vínculo com o Cadastro
Técnico, id_endereco_pbh.
Nota 3¶
Limites de retorno e paginação¶
O Endcorp não pagina: os resultados são truncados silenciosamente por ROWNUM no banco:
| Serviço do Endcorp | Limite máximo de registros |
|---|---|
enderecosvalidados |
100 |
enderecosavalidar |
50 |
enderecoforabh |
50 |
O Endereço BH pagina todos os recursos. Os parâmetros são quantidade (tamanho da página) e
pagina (número da página, iniciando em 0):
| Recurso | quantidade padrão |
|---|---|
/enderecos |
5 |
/enderecos_validar |
5 |
/logradouros, /bairros_populares, /bairros_oficiais, /regionais, /tipos_logradouro, /dnes, /complementos, /enderecos/reverso |
50 |
Atenção: os envelopes de paginação do Endereço BH não informam o total de registros
(totalElements/totalPages não são retornados). Para percorrer todos os resultados, itere
pagina incrementando de 1 em 1 até que features venha vazio. Se o sistema atual dependia dos
até 100/50 registros do Endcorp, revise o laço de paginação na migração.
Nota 4¶
Semântica das buscas por nome e filtros¶
- Endcorp: o parâmetro
tipo_pesquisa_logradourocontrola o curinga aplicado ao nome informado (%antes, depois ou ambas). Ele é obrigatório sempre quelogradouro_informadofor informado nos serviços de endereço — sem ele o serviço respondeErr003: O campo obrigatório TIPO_PESQUISA_LOGRADOURO não foi preenchido. Em/lougradouroso parâmetro equivalente étipo_pesquisa(documentado como "consultar RNE002"). Em/enderecocompletoé obrigatóriotipo_pesquisa(1..5, indicando quais conjuntos de endereços consultar). - Endereço BH: em
qa busca é por similaridade/presença do termo; nos filtros estruturados (nome_logradouro,bairro_popular,sigla_tipo_logradouro,qem coleções) o tratamento de acentuação, caixa e correspondência parcial deve ser validado durante a migração — os dois sistemas não necessariamente retornam os mesmos conjuntos de resultados. Diferenças de presença e de ordenação entre os dois serviços são esperadas. - Ordenação: o Endereço BH permite ordenar (
ordenar=campo,asc|desc); por padrão,/logradourosé ordenado porcod_logradouroe/dnesporcep;/enderecosnão ordena. - Filtro aproximado de número: o Endcorp usa
numero_informado+num_aproximado+maior_que/menor_que; o Endereço BH usaaproximado=truee/ounumero_min/numero_max(comparidade=truepara mesma paridade).
Nota 5¶
Filtro de logradouro em enderecologradouro¶
No Endcorp, o parâmetro id_logradouro_informado de enderecologradouro é aplicado sobre a
coluna lg.cod_logradouro, enquanto o retorno expõe lg.id_logradouro
(AppJpaDAO.pesquisaEnderecoLogradouro). No Endereço BH, GET /enderecos?id_logradouro= filtra
pela coluna id_logradouro.
Nas consultas realizadas os valores cod_logradouro e id_logradouro foram sempre iguais, mas
recomenda-se validar esse parâmetro com os dados de produção antes de concluir a migração.
O mesmo serviço no Endcorp também exclui do resultado os endereços com
status_reg_urbana = 'R' AND status_ctm = 'N' e somente retorna ind_ativo = 'S'. No Endereço
BH o padrão é ind_ativo=ativo (use ind_ativo=todos para ignorar).
Nota 6¶
Filtros não funcionais no Endcorp¶
/lougradouros: o parâmetroid_logrnão é aceito como critério único de pesquisa (Err005: Deve ser informado pelo menos um parâmetros de pesquisa) e é ignorado quando combinado comnome_logr. No Endereço BH a consulta por identificador existe:GET /logradouros/{id}./service/bairros,/service/regionaise demais catálogos aceitam filtro por identificador, mas no Endereço BH esses filtros estão disponíveis em/{id}(coleções como/regionaisaceitam apenascod_regional, nãoid).
Nota 7¶
Formato de erro¶
| Endcorp | Endereço BH |
|---|---|
HTTP 404 (ou 200) com {"errorResponseConverter":{"codigoErro":"Err003","mensagemErro":"..."}} |
Código HTTP padrão (400/401/404/…) com corpo de erro do Spring/Keycloak |
Sem resultado: Err008 — Nenhum resultado foi encontrado (em alguns serviços, resposta 200 com corpo vazio) |
200 com {"type":"FeatureCollection","features":[]} |
Erro interno: {"messages":{"erro":["JCP - 000107 ..."]}} |
— |
Ajuste o tratamento de exceções do sistema consumidor: não é mais possível identificar "sem
resultado" apenas pelo código Err008.
Passo 3¶
Alteração na implementação existente¶
Os serviços disponíveis no Endereço BH possuem URL, método HTTP, parâmetros e formato de retorno diferentes dos serviços disponíveis no Endcorp, em alguns casos não possuindo uma equivalência direta.
Poderá ser observado um comportamento diferente quanto aos resultados obtidos entre os dois sistemas, principalmente diferenças quanto à presença de mais endereços ou com ordenação diferente dos resultados.
Mudança de URL¶
URL base dos serviços:
- Endcorp:
http://endcorp.pbh/endereco-corporativo/soa/(homologação:http://endcorp-hm.pbh/endereco-corporativo/soa/) - Endereço BH:
https://enderecobh.pbh.gov.br/api/v1/
URL do ambiente de homologação: https://enderecobh-hm.pbh.gov.br (conferir o caminho
/api/v1 no ambiente de homologação)
A nova URL está disponível somente no protocolo HTTPS.
- Endereço Externo (quando o sistema precisa de endereços fora de BH):
https://endereco-externo.pbh.gov.br/— os paths ficam na raiz (/enderecos,/logradouros, ...), sem prefixo/api/v1.
URL do ambiente de homologação: https://endereco-externo-hm.pbh.gov.br/
URL, método e corpo das chamadas ao Endereço Externo são próprios do serviço — ver Cobertura dos serviços e o Swagger.
Método HTTP e corpo da requisição¶
| Endcorp | Endereço BH | |
|---|---|---|
| Método | POST em todos os serviços |
GET (leitura) e POST somente em /enderecos_validar |
| Parâmetros | corpo JSON: {"parametros":{...}} |
query string: ?chave=valor&chave=valor |
| Encodings | JSON | Valores com espaços devem ser codificados (%20 ou +) |
Exemplo:
# Endcorp
curl -X POST http://endcorp.pbh/endereco-corporativo/soa/service/enderecosvalidados \
-H "Content-Type: application/json" \
-d '{"parametros":{"logradouro_informado":"AFONSO PENA","numero_informado":1000,"tipo_pesquisa_logradouro":1}}'
# Endereço BH
curl -X GET "https://enderecobh.pbh.gov.br/api/v1/enderecos?nome_logradouro=AFONSO+PENA&numero=1000" \
-H "Authorization: Bearer CONTEUDO_ACESS_TOKEN"
Requisição¶
Autorização e Autenticação¶
O Endereço BH implementa o protocolo OAuth2/OpenID Connect (Keycloak, realm PBH) para controlar o acesso aos serviços. Para utilizar os serviços é necessário encaminhar no cabeçalho de cada requisição o Access Token obtido através do AcessoPBH/ GAS-PBH.
Endpoint de emissão do token (fluxo password, client credentials do sistema):
https://acesso.pbh.gov.br/auth/realms/PBH/protocol/openid-connect/token
Exemplo de requisição ao Endereço BH:
GET /api/v1/enderecos?q=avenida afonso pena 1212
Authorization: Bearer CONTEUDO_ACESS_TOKEN
Mais informações na documentação do Endereço BH (https://enderecobh.pbh.gov.br/v3/api-docs e
https://enderecobh.pbh.gov.br/swagger-ui.html).
O Endereço Externo usa o mesmo fluxo OAuth2/OpenID Connect do Acesso PBH (obter o
Access Token e enviá-lo no cabeçalho Authorization: Bearer ...), conforme descrito em
Cobertura dos serviços. No Endereço Externo o token expira em 5 minutos
(verificado na homologação, expires_in=300) — implementar a renovação automática.
Formato de saída¶
Endereço¶
No Endcorp os campos do endereço ficam disponíveis nas propriedades de um objeto com wrapper
(enderecoValidado, enderecoPBH, enderecoAValidar, ...), dentro de um array.
Exemplo saída JSON Endcorp — Pesquisa Endereço¶
[
{
"enderecoValidado": {
"cod_endereco_corporativo": 616372,
"id_endereco_pbh": 10681,
"id_tipo_logradouro": 3,
"sigla_tipo_logradouro": "AVE",
"desc_tipo_logradouro": "AVENIDA",
"nome_logradouro": "AFONSO PENA",
"id_logradouro": 1259,
"numero_imovel": 1000,
"cep": 30130003,
"id_bairro": 37,
"nome_bairro_popular": "Centro",
"nome_bairro_oficial": "Terceira",
"id_regional": 10,
"nome_regional": "HIPERCENTRO",
"id_territorio": 41,
"nome_territorio": "Território 1 da Regional HIPERCENTRO",
"coordenadax": 611236.429250523,
"coordenaday": 7796811.7761125
}
}
]
Exemplo saída GeoJSON Endereço BH — Pesquisa Endereço¶
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"id": 713858,
"id_endereco_pbh": 157801,
"id_tipo_logradouro": 18,
"tipo_logradouro": "RUA",
"sigla_tipo_logradouro": "RUA",
"id_logradouro": 3125,
"nome_logradouro": "AMAROS",
"numero": 172,
"letra": "A",
"id_bairro_popular": 167,
"bairro_popular": "São Paulo",
"id_bairro_oficial": 71,
"bairro_oficial": "São Paulo",
"id_regional": 4,
"cod_regional": 21,
"nome_regional": "NORDESTE",
"cep": "31910180",
"id_territorio": 4,
"id_territorio_fiscalizacao": 7,
"sigla_territorio": "NE3",
"ind_ativo": "ativo",
"status_ctm": "E",
"wkt": {
"epsg_4326": "POINT (-43.9223085833891 -19.8685332830945)",
"epsg_31983": "POINT (612830.601300225 7802706.02354846)"
}
},
"geometry": {
"type": "Point",
"coordinates": [-43.9224199449533, -19.8685907791933]
}
}
],
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 5,
"paged": true,
"unpaged": false
}
Os campos de paginação (pageNumber, pageSize, offset, paged, unpaged, sort) são
decorrentes do parâmetro quantidade informado na requisição. Não há totalElements nem
totalPages (nota 3).
Propriedades do Endereço¶
No Endereço BH o resultado utiliza o formato GeoJSON: cada registro é
retornado como um objeto dentro do campo {features[]}, e os campos de cada registro estão
disponíveis no objeto {features[].properties}.
Equivalências entre os campos¶
Os wrappers do Endcorp variam conforme o serviço. As tabelas abaixo consideram os formatos retornados em produção.
Endereço — enderecoValidado (enderecosvalidados) e enderecoAValidar (enderecosavalidar)¶
| Campo Endcorp | Campo Endereço BH | Observação |
|---|---|---|
| cod_endereco_corporativo | id | mesmo valor (nota 2) |
| id_endereco_pbh | id_endereco_pbh | chave do Cadastro Técnico |
| id_tipo_logradouro | id_tipo_logradouro | |
| sigla_tipo_logradouro | sigla_tipo_logradouro | |
| desc_tipo_logradouro | tipo_logradouro | |
| nome_logradouro | nome_logradouro | |
| id_logradouro | id_logradouro | |
| numero_imovel | numero | |
| letra_imovel | letra | |
| cep (numérico) | cep (texto) | converter para string com 8 dígitos |
id_bairro (= id_bairro_popular) |
id_bairro_popular | |
| nome_bairro_popular | bairro_popular | |
| nome_bairro_oficial | bairro_oficial | |
| id_regional | id_regional | |
| - | cod_regional | novo |
| nome_regional | nome_regional | |
| id_territorio | id_territorio | |
| nome_territorio | - | não exposto pelo Endereço BH |
| - | sigla_territorio | novo (ex.: CS1) |
| - | id_territorio_fiscalizacao | novo |
| - | status_ctm | novo como campo de retorno |
| - | ind_ativo | novo (ativo/inativo) |
| coordenadax / coordenaday | geometry.coordinates / wkt.epsg_31983 | geometria |
| status_reg_urb_informado (filtro) | - | não exposto pelo Endereço BH |
Endereço — enderecoPBH (enderecocodigo, enderecologradouro)¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| (chave enviada) cod_endereco_corporativo / param_endereco | id |
| logradouro | nome_logradouro |
| sigla_tipo_logradouro | sigla_tipo_logradouro |
| tipo_logradouro / desc_tipo_logradouro | tipo_logradouro |
| id_tipo_logradouro | id_tipo_logradouro |
| id_logradouro | id_logradouro |
| numero | numero |
| letra | letra |
| cep | cep |
| id_bairro | id_bairro_popular |
| bairro_popular | bairro_popular |
| bairro_oficial | bairro_oficial |
| id_regional | id_regional |
| regional | nome_regional |
| id_territorio | id_territorio |
| territorio (descrição) | - |
| coordenadax / coordenaday | geometry.coordinates / wkt.epsg_31983 |
Logradouro — logradouro (/lougradouros)¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| codigo | cod_logradouro |
| id_logradouro | id |
| logradouro | nome_logradouro |
| sigla_tipo | sigla_tipo_logradouro |
| desc_tipo | tipo_logradouro |
| nome_bairro | - |
| id_bairro | - |
| - | outros_nomes |
| - | ind_ativo |
| - | wkt |
Tipo de logradouro — tipoLogradouro (/tipologradouros)¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| idTipoLogradouro | id |
| sigla | sigla_tipo_logradouro |
| descricao | desc_tipo_logradouro |
| - | ind_ativo |
Bairro (popular) — bairro (/service/bairros)¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| id_bairro | id |
| codigo | cod_bairro |
| nome | nome_bairro |
| - | cod_regional |
| - | id_regional |
| - | nome_regional |
| - | classificacao |
| - | ind_ativo |
| - | wkt |
Regional — regional (/service/regionais)¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| id_regional | id |
| codigo | cod_regional |
| sigla | sigla_regional |
| nome | nome_regional |
| - | ind_ativo |
| - | wkt |
Complemento — complementoEndereco (/service/complementosendereco)¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| (chave enviada) cod_endereco | id_endereco (= CodEndcorp) |
| - | id_endereco_pbh |
| id_tipocomp | id_tipo_complemento |
| sigla_tipo_complemento | sigla_tipo_complemento |
| descricao_tipo_complemento | descricao_tipo_complemento |
| desc_complemento1 | descricao_complemento1 |
| desc_complemento2 | descricao_complemento2 |
| sequencia_do_complemento | sequencia_do_complemento |
| id_endercorpo_compl_agrupado | id_endercorpo_compl_agrupado |
DNE — dne (/service/dne)¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| cep | cep |
| nome_logradouro | nome_logradouro |
| tipo_logradouro | tipo_logradouro |
| nome_bairro | nome_bairro |
| sigla_uf | sigla_uf |
| nome_localidade | nome_localidade |
| codigo_ibge_municipio | codigo_ibge_municipio |
| variacao_nome_logradouro | - |
| numero | - |
Território de Gestão Compartilhada — territoriogestaocompartilhada¶
| Campo Endcorp | Campo Endereço BH |
|---|---|
| id_territorio | id_territorio (em /enderecos) |
| identificador | sigla_territorio |
| descricao | - |
Campo Geometria¶
No Endcorp a geometria de cada endereço está presente nos atributos coordenadax e
coordenaday. O formato de coordenada utilizado é o
Sirgas 2000 23S (EPSG 31983).
Exemplo:
[{"enderecoValidado": {
...
"coordenadax": 612606.427684689,
"coordenaday": 7796771.17983388
}}]
No resultado do Endereço BH cada endereço é retornado como Feature do GeoJSON com o campo
{features[].geometry}, utilizando o sistema de coordenadas
WGS84 (EPSG 4326).
Também é informado o tipo {features[].geometry.type} de geometria e, no caso dos endereços, ele
será sempre "Point".
Exemplo:
{
...
"features": [
{
...
"geometry": {
"type": "Point",
"coordinates": [-43.9224199449533, -19.8685907791933]
}
}
],
...
}
São retornadas também as geometrias no formato WKT (campo {features[].properties.wkt}) nos
sistemas de coordenadas:
- WGS84 (EPSG 4326) em
{features[].properties.wkt.epsg_4326} - Sirgas 2000 23S (EPSG 31983) em
{features[].properties.wkt.epsg_31983}— mesmo sistema de coordenadas utilizado no Endcorp
Exemplo:
{
...
"features": [
{
...
"properties": {
...
"wkt": {
"epsg_4326": "POINT (-43.9224199449533 -19.8685907791933)",
"epsg_31983": "POINT(612818.900382729 7802699.73479656)"
}
}
}
],
...
}
Os parâmetros espaciais do Endereço BH (bbox, poligono, coordenadas, crs) aceitam
EPSG4326 ou EPSG31983 conforme o parâmetro crs.
Regras de filtragem padrão¶
| Regra | Endcorp | Endereço BH |
|---|---|---|
| Endereços ativos | ep.ind_ativo = 'S' (sempre) |
ind_ativo=ativo (padrão; inativo/todos disponíveis) |
| Status CTM | filtro opcional status_ctm_informado (E,N,D) |
status_ctm (e,n,d,vazio, padrão todos) |
| Status Regulação Urbana | filtro opcional status_reg_urb_informado (C,I,R) |
não exposto |
Exceção em enderecologradouro |
exclui status_reg_urbana='R' com status_ctm='N' |
sem equivalência direta |
Passos permissão¶
Passos para solicitar concessão de permissão¶
- Definir quais serviços do Endereço BH serão utilizados.
- Identificar as permissões necessárias para acessos aos serviços.
- Solicitar via SDM a concessão das permissões para o usuário do sistema, informando o usuário e os tipos de permissões.
Área da solicitação SDM:
Servicos de Tecnologia e Informacao.Geoprocessamento.BHMap.Conteudo
Caso Uso básico do Endcorp¶
- Usuário inicia a pesquisa por um determinado endereço em uma Aplicação.
- Aplicação realiza a consulta ao Endcorp, utilizando REST (
POSTcom corpo JSON). - Endcorp verifica as credenciais de acesso fornecidas no Josso (necessário para as operações de escrita; as consultas de leitura testadas dispensaram autenticação).
- Josso retorna as permissões para o Endcorp.
- Endcorp retorna o resultado em formato JSON para Aplicação.
- Aplicação exibe para o Usuário o endereço localizado.
Caso Uso básico do Endereço BH¶
- Diagramas com fluxo Pesquisa de Endereço no Endereço BH
- Usuário inicia a pesquisa por um determinado endereço em uma Aplicação.
- Aplicação realiza a autenticação e solicita a credencial (access token) ao AcessoPBH.
- AcessoPBH retorna a credencial para Aplicação.
- Aplicação realiza a requisição ao Endereço BH passando no cabeçalho a credencial obtida do AcessoPBH.
- Endereço BH retorna o resultado em formato GeoJSON para Aplicação.
- Aplicação exibe para o Usuário o endereço localizado.
Apêndice — fontes verificadas¶
- Swagger do Endcorp:
endcorp-original/docs/requisitos/DocumentacaoSwagger/EndcorpDocumentacaoSwagger.yaml - Código-fonte do Endcorp:
AppJpaDAO(SQL, limitesROWNUM, semântica dos filtros) e recursos JAX-RS (@Pathde cada serviço) - OpenAPI do Endereço BH:
https://enderecobh.pbh.gov.br/v3/api-docs(versão 1.0.32) - Código-fonte do Endereço BH:
webservice(mapeamento dos documentos/indexes),logstash(SQL de alimentação do Elasticsearch) - Chamadas reais ao Endcorp em produção (leitura) para conferência de caminhos, wrappers, parâmetros obrigatórios e mensagens de erro
- Documentação do Endereço Externo:
https://endereco-externo.pbh.gov.br/documentacao/, página oficial de migraçãohttps://endereco-externo.pbh.gov.br/documentacao/migracao/endcorp-enderecoexterno/e Swaggerhttps://endereco-externo.pbh.gov.br/swagger-ui/index.html - OpenAPI do Endereço Externo (homologação):
https://endereco-externo-hm.pbh.gov.br/v3/api-docs— produção estava em manutenção (HTTP503) no momento da verificação - Chamadas reais ao Endereço Externo em homologação (
endereco-externo-hm.pbh.gov.br), com token do Acesso PBH, para conferência de filtros, paginação, formatos de erro e exemplos