Com o intuito de fechar esse tópico, e documentar a solução pra futuras dúvidas, um amigo e eu resolvemos o problema da seguinte forma:
Lembrando que todos os procedimento foram realizados apenas no front-end.
Inicialmente criamos um arquivo json chamado proxy.conf.json com este conteúdo:
{
"/sipesweb/sei": {
"target": "https://sei.homologa.unb.br/sei/ws/SeiWS.php",
"secure": false,
"logLevel": "debug",
"pathRewrite": { "^/sipesweb/sei": "" },
"changeOrigin": true
}
}
Criamos uma função assíncrona pra tratar a resposta da requisição:
public async pesquisarSEI() {
try {
if (this._correspondenciaSelecionada.unbDoc.trim().length > 0) {
await this._seiService.consultarProcesso(this._correspondenciaSelecionada.unbDoc.trim()).then(async response => {
if (await response) {
console.log(JSON.stringify(response));
this._correspondenciaSelecionada.unbDoc = response.ProcedimentoFormatado;
this._correspondenciaSelecionada.assunto = response.Especificacao.toUpperCase();
this._correspondenciaSelecionada.favorecido = ''; //response.Interessados[0].Nome.toUpperCase();
} else {
this._correspondenciaService.showMessage('Não existe processo com o número informado!');
}
});
} else {
this._correspondenciaService.showMessage('Por favor, informe um número de Processo!');
}
} catch (error) {
catchError(this._correspondenciaService.handleError);
this._correspondenciaService.showMessage(error.message);
}
}
Criamos uma função, também assíncrona, pra realizar a consulta das informações:
/**
* Realiza a consulta de processos no SEI.
*
* @param numeroProcesso Número do processo a ser pesquisado.
* @returns Promise da interface ConsultarProcedimentoResponse
*/
public async consultarProcesso(numeroProcesso: string): Promise<ConsultarProcedimentoResponse> {
let procedimentoResposta;
try {
const request = this.montarRequest(numeroProcesso); // Monta o conteúdo da requisição.
console.log('Mensagem montada!');
console.log('Estabelecendo conexão com o serviço SOAP...');
await this._soap.createClient('assets/ws_sei.wsdl').then( // Estabelece a conexão com o servidor SOAP.
async client => {
this._client = client;
if (this._client) {
console.log('Conexão estabelecida!');
console.log('Encaminhando mensagem...');
/**
* A função consultarProcedimento() é o serviço oferecido no WSDL para a consulta a ser realizada,
* essa função recebe, obrigatoriamente, o conteúdo da requisição (envelope).
*/
await this._client.consultarProcedimento(request).toPromise().then(async respostaRequisicao => {
await this.montarResponse(respostaRequisicao).then(respostaMontada => {
procedimentoResposta = respostaMontada;
console.log('Resposta recebida!');
});
});
} else {
throw 'Não foi possível estabelecer a conexão com o serviço!';
}
});
} catch (error) {
throw error;
} finally {
return procedimentoResposta;
}
}
Criamos uma função para montar o envelope de requisição:
/**
* Monta o envelope de requisição para o protocolo SOAP.
*
* @param numeroProcesso Número do processo a ser pesquisado.
* @returns Objeto baseado na interface ConsultarProcedimentoRequest.
*/
private montarRequest(numeroProcesso: string): ConsultarProcedimentoRequest {
try {
console.log('Montando mensagem de requisição...');
return {
SiglaSistema: 'SIPESWEB', // Nome do sistema registrado.
IdentificacaoServico: 'consultarProcesso', // WebService a ser utilizado.
IdUnidade: '', // Filtro
ProtocoloProcedimento: numeroProcesso, // Número do processo a ser pesquisado.
SinRetornarAssuntos: 'S', //
SinRetornarInteressados: 'S', //
SinRetornarObservacoes: 'S', //
SinRetornarAndamentoGeracao: 'N', //
SinRetornarAndamentoConclusao: 'N', // Configurações adicionais
SinRetornarUltimoAndamento: 'N', //
SinRetornarUnidadesProcedimentoAberto: 'N', //
SinRetornarProcedimentosRelacionados: 'N', //
SinRetornarProcedimentosAnexados: 'N' //
}
} catch (error) {
throw error;
}
}
Criamos uma função para realizar o parse de XML para JSON:
/*
* Realiza o parse do XML obtido na resposta para JSON.
*
* @param respostaRequisicao Response obtido pela pesquisa realizada.
* @returns Promise baseada na interface ConsultarProcedimentoResponse.
*/
private async montarResponse(respostaRequisicao): Promise {
try {
let parser = new DOMParser();
let xml = parser.parseFromString(respostaRequisicao.responseBody.toString(), 'application/xml');
console.log('Obtendo objeto resposta...');
return {
IdProcedimento: xml.getElementsByTagName('IdProcedimento')[0].childNodes[0].nodeValue,
ProcedimentoFormatado: xml.getElementsByTagName('ProcedimentoFormatado')[0].childNodes[0].nodeValue,
Especificacao: xml.getElementsByTagName('Especificacao')[0].childNodes[0].nodeValue,
DataAutuacao: xml.getElementsByTagName('DataAutuacao')[0].childNodes[0].nodeValue,
LinkAcesso: xml.getElementsByTagName('LinkAcesso')[0].childNodes[0].nodeValue,
TipoProcedimento: this.montarTipoProcedimento(xml.getElementsByTagName('TipoProcedimento')),
AndamentoGeracao: this.montarAndamento(xml.getElementsByTagName('AndamentoGeracao')),
AndamentoConclusao: this.montarAndamento(xml.getElementsByTagName('AndamentoConclusao')),
UltimoAndamento: this.montarAndamento(xml.getElementsByTagName('UltimoAndamento')),
UnidadesProcedimentoAberto: this.carregarListaUnidades(xml.getElementsByTagName('UnidadesProcedimentoAberto')),
Assuntos: this.carregarListaAssuntos(xml.getElementsByTagName('Assuntos')),
Interessados: this.carregarListaInteressados(xml.getElementsByTagName('Interessados')),
Observacoes: this.carregarListaObservacoes(xml.getElementsByTagName('Observacoes')),
ProcedimentosRelacionados: this.carregarListaProcedimentos(xml.getElementsByTagName('ProcedimentosRelacionados')),
ProcedimentosAnexados: this.carregarListaProcedimentos(xml.getElementsByTagName('ProcedimentosAnexadoss'))
}
} catch (error) {
throw error;
}
}
E chamamos a pesquisa em um botão diretamente na página web.
<button id="btnPesquisa" matSuffix mat-icon-button color="primary" title="Pesquisar SEI" aria-label="Pesquisar SEI" (click)="pesquisarSEI()" type="button"><mat-icon>search</mat-icon></button>
Com isso, conseguimos acessar diretamente o SOAP e tratar as informações recebidas de acordo com a necessidade.
Desde já agradeço a opnião de todos.