UTL_HTTP - Erro no envio dos dados

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Boa tarde Galera,
estou com problemas para utilizar o pacote UTL_HTTP, retorna a seguinte mensagem de erro da requisição

Selecionar tudo

System.InvalidOperationException: Request format is invalid: text/xml;charset=utf-8.
   at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
Estou tentando se comunicar com o webservice do WallMart, para envio de NF-e.
Alguém tem experiência com está package (UTL_HTTP)?

Segue o código fonte que retorna o erro apresentado acima.

Selecionar tudo

declare
  l_url           varchar2(500);
  l_http_request  UTL_HTTP.req;
  l_http_response UTL_HTTP.resp;
  l_request       soap_api.t_request;
  l_response      soap_api.t_response;
  VA_ERROR_MSG    VARCHAR2(4000);

begin
  -- Test statements here
  l_xml := '<?xml version="1.0" encoding="utf-8"?>
            <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
              <soap:Body>
                <fu_upld xmlns="http://www.pontsystems.com.br/">
                  <pa_tp_cd_usua>J</pa_tp_cd_usua>
                  <pa_cd_usua>CNPJ da empresa</pa_cd_usua>
                  <pa_ds_xml_nfe>' || l_xml || '</pa_ds_xml_nfe>
                </fu_upld>
              </soap:Body>
            </soap:Envelope>';
  pack_debug.del;
  L_URL          := 'http://portalnfe.wmsul.com.br/GNFe_Port_ws/cls_403_nfe_xml.asmx/fu_upld';
  l_http_request := UTL_HTTP.begin_request(l_url, 'POST', 'HTTP/1.1');
  --
  UTL_HTTP.set_header(l_http_request, 'Content-Type', 'text/xml;charset=utf-8');
  UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(l_xml));
  UTL_HTTP.set_header(l_http_request, 'SOAPAction', '"http://www.pontsystems.com.br/fu_upld"');
  UTL_HTTP.write_text(l_http_request, l_xml);
  pack_debug.ADD(TO_CLOB(l_xml), 'write_text');
  l_http_response := UTL_HTTP.get_response(l_http_request);
  UTL_HTTP.read_text(l_http_response, l_xml);
  UTL_HTTP.end_response(l_http_response);

  pack_debug.ADD(TO_CLOB(l_xml), 'RESPONSE');

  l_response.doc          := XMLTYPE.createxml(l_xml);
  l_response.envelope_tag := 'soap'; --p_request.envelope_tag;
  l_response.doc          := l_response.doc.extract('/' || l_response.envelope_tag || ':Envelope/' || l_response.envelope_tag ||
                                                    ':Body/child::node()',
                                                    'xmlns:' || l_response.envelope_tag || '="http://schemas.xmlsoap.org/soap/envelope/"');
  soap_api.check_fault(l_response);
  --RETURN l_response;
exception
  when others then
    VA_ERROR_MSG := sqlerrm || CHR(10) || ' ERRO: ****************REQUISIÇÃO****************' || CHR(10) || ' Código Erro:' ||
                    l_http_request.private_hndl || ' - URL:' || l_http_request.url || '- METHOD:' || l_http_request.method || ' - HTTP_VERSION: ' ||
                    l_http_request.http_version || CHR(10) || 'ERRO: ****************RESPOSTA****************' || CHR(10) || ' Código Erro:' ||
                    l_http_response.private_hndl || ' - STATUS_CODE:' || l_http_response.status_code || '- REASON_PHRASE:' ||
                    l_http_response.reason_phrase || ' - HTTP_VERSION: ' || l_http_response.http_version;
    DBMS_OUTPUT.PUT_LINE(VA_ERROR_MSG);
    raise_application_error(-20001, 'erro');
end;
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá tora34,

Não trabalho com o UTL_HTTP, mas pesquisei um pouco sobre o tema e fico pensando se não teria algo a ver com o CHARACTERSET utilizado.

Eu encontrei esta thread no OTN FORUM:

https://forums.oracle.com/thread/2446819

E algumas informações neste manual ORACLE:

http://docs.oracle.com/cd/B19306_01/app ... m#i1027267

Veja se ela pode lhe dar alguma luz sobre o problema. Eles abordam sobre um parâmetro chamado SET_BODY_CHARSET

Abraços,

Sergio Coutinho
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Bom dia Coutinho,
obrigado pelo retorno.
Ainda não cheguei a uma solução, mas essa última semana adquiri algum conhecimento que venho aqui compartilhar.
Estou tentando me comunicar com um WebService que somente aceita requisições de dados seguras, ou seja, criptografadas, ou seja, utilizando o certificado SSL (HTTPS). Para se comunicar em um domínio HTTPS utilizando o pacote UTL_HTTP é necessário "importar" o certificado do site para dentro do servidor do banco de dados via Um aplicativo da oracle chamado Oracle Wallet, ou simplesmente copiar em um diretório dentro do servidor do banco de dados. Após isso apontar a localização deste certificado utilizando a procedure set_wallet do pacote UTL_HTTP.
Porém, não gostei deste método. De ter que importar o certificado para criptografar a a requisição, tendo em vista que em outras tecnologias, como JAVA ou DOT NET, existe uma biblioteca padrão para executar tal função.
--
Minha opção para implementar está solução será utilizar STORED JAVA, que apesar de ser uma versão antiga de desenvolvimento, da conta do recado.
Quando concluir os trabalhos posto aqui o resultado.

Obrigado
Avatar do usuário
bessa_lucas
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Sex, 17 Out 2014 3:02 pm
Lucas Bessa
Analista de Sistemas

lucas.bessa@obers.com.br
lucas.bessa.ti@gmail.com

Pessoal,

Assim como muitos aqui também estava procurando uma forma de acessar o webservice via PL\SQL.

Mas depois de várias tentativas comecei a encontrar links com as seguintes respostas

http://stackoverflow.com/questions/2793 ... g-utl-http

https://community.oracle.com/thread/3935384

https://community.oracle.com/message/1927297#1927297

Aparentemente tem um Bug em algumas versões do banco de dados que não aceitam o certificado SSLv3 que é justamente o meu caso. Não posso utilizar java no projeto.
Por hora a solução que estamos encontrando é fazer uma página http no nosso site que repassa ao webservice. Uma gambiarra terrível, mas é o que estamos conseguindo até agora.

Se alguém souber alguma solução...
Responder
  • Informação