Ir para o conteúdo

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 o cod_endereco_corporativo do Endcorp nem o id do 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: 401 com {"codigo":"SEG-401","mensagem":"Você precisa estar autenticado..."}. Apenas /healthcheck responde sem autenticação.
  • Recurso inexistente: 404 com {"codigo":"ME-003","mensagem":"...","data":"..."}. Valor inválido em {id} (ex.: texto): 500 com 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 com 400 Bad request.
  • Filtro nome em /logradouros faz igualdade exata com o nome completo (busca parcial retorna vazio); use q para busca parcial. Em /municipios o filtro nome foi ignorado na verificação (retornou a listagem completa) — usar q ou id_uf/sigla_uf.
  • q e os filtros cep, numero, listar_desativados, ordenar de /enderecos foram 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 (HTTP 503) 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

  1. Criação de usuário e permissões para acesso ao Endereço BH
  2. Validação dos casos de usos disponíveis no Endereço BH
  3. 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 exigem Access Token no 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_logradouro controla o curinga aplicado ao nome informado (% antes, depois ou ambas). Ele é obrigatório sempre que logradouro_informado for informado nos serviços de endereço — sem ele o serviço responde Err003: O campo obrigatório TIPO_PESQUISA_LOGRADOURO não foi preenchido. Em /lougradouros o parâmetro equivalente é tipo_pesquisa (documentado como "consultar RNE002"). Em /enderecocompleto é obrigatório tipo_pesquisa (1..5, indicando quais conjuntos de endereços consultar).
  • Endereço BH: em q a busca é por similaridade/presença do termo; nos filtros estruturados (nome_logradouro, bairro_popular, sigla_tipo_logradouro, q em 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 por cod_logradouro e /dnes por cep; /enderecos não ordena.
  • Filtro aproximado de número: o Endcorp usa numero_informado + num_aproximado + maior_que/menor_que; o Endereço BH usa aproximado=true e/ou numero_min/numero_max (com paridade=true para 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âmetro id_logr não é aceito como critério único de pesquisa (Err005: Deve ser informado pelo menos um parâmetros de pesquisa) e é ignorado quando combinado com nome_logr. No Endereço BH a consulta por identificador existe: GET /logradouros/{id}.
  • /service/bairros, /service/regionais e demais catálogos aceitam filtro por identificador, mas no Endereço BH esses filtros estão disponíveis em /{id} (coleções como /regionais aceitam apenas cod_regional, não id).

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
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:

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

  1. Definir quais serviços do Endereço BH serão utilizados.
  2. Identificar as permissões necessárias para acessos aos serviços.
  3. 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

graph LR u([usuário]) a[aplicação] j[Josso / autenticação] e[Endcorp] u-- 1 --> a a-- 2 --> e e-- 3 --> j j-- 4 --> e e-- 5 --> a a-- 6 --> u
sequenceDiagram autonumber participant U as Usuário participant A as Aplicação participant E as Endcorp participant J as Josso U->>A: Pesquisa endereço A->>E: Requisição REST (POST com JSON) E->>J: Verifica as credenciais de acesso no Josso (operações de escrita) J->>E: Retorna a permissão de acesso E->>A: Retorna JSON A->>U: Endereço localizado
  1. Usuário inicia a pesquisa por um determinado endereço em uma Aplicação.
  2. Aplicação realiza a consulta ao Endcorp, utilizando REST (POST com corpo JSON).
  3. 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).
  4. Josso retorna as permissões para o Endcorp.
  5. Endcorp retorna o resultado em formato JSON para Aplicação.
  6. Aplicação exibe para o Usuário o endereço localizado.

Caso Uso básico do Endereço BH

  1. Diagramas com fluxo Pesquisa de Endereço no Endereço BH
graph LR u([usuário]) a[aplicação] ec[Endereço BH] gk[acessopbh/oauth2] gk-- 3 -->a u-- 1 -->a a-- 2 -->gk a-- 4 -->ec ec-- 5 -->a a-- 6 -->u
sequenceDiagram autonumber participant U as Usuário participant A as Aplicação participant K as AcessoPBH/OAuth2 participant G as Endereço BH U->>A: Pesquisa endereço A->>K: Realiza Autenticação K->>A: Retorna Acess Token A->>G: Requisição REST Note over A,G: requisição acess token no cabeçalho G->>A: Retorna GeoJSON A->>U: Endereço localizado
  1. Usuário inicia a pesquisa por um determinado endereço em uma Aplicação.
  2. Aplicação realiza a autenticação e solicita a credencial (access token) ao AcessoPBH.
  3. AcessoPBH retorna a credencial para Aplicação.
  4. Aplicação realiza a requisição ao Endereço BH passando no cabeçalho a credencial obtida do AcessoPBH.
  5. Endereço BH retorna o resultado em formato GeoJSON para Aplicação.
  6. 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, limites ROWNUM, semântica dos filtros) e recursos JAX-RS (@Path de 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ção https://endereco-externo.pbh.gov.br/documentacao/migracao/endcorp-enderecoexterno/ e Swagger https://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 (HTTP 503) 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