Acessar um webservice com plsql

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
Avatar do usuário
fabdepaula
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 15 Mai 2008 8:53 pm
Localização: Araraquara -SP

Boa tarde.

Gostaria de saber se algum conhece como eu utilizo um serviço de webservice no oracle.

tenho um webservice que eu criei e esta rodando num servidor tomcat, agora eu precisava acessar esse webservice com a minha aplicação em oracle, preciso acessar atraves de uma função em pl ou pode ser pelo forms 6i.

alguém sabe como da para fazer isso??
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

Olá gostaria de saber se você conseguiu resolver o seu problema de se conectar a um webservice via pl/sql?
nightmare
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 15 Ago 2008 4:02 pm
Localização: São Paulo - SP

Olha, eu nunca fiz nada como isso mas você provavelmente precisará usar o pacote UTL_CONNECTION para abrir uma conexão pela porta 80 e depois o método WRITE (acho que esse que escreve) montando um "envelope" SOAP. Mais uma vez, senão estiver errado o SOAP será parecido com isso;

Selecionar tudo

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="URN DO WEB SERVICE AQUI"> 
   <soapenv:Header/> 
   <soapenv:Body> 
      <urn:NOME DO SERVICO AQUI soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
        SEU XML AQUI.
      </urn:NOME DO SERVICO AQUI > 
   </soapenv:Body> 
</soapenv:Envelope> 
Caso ninguém responda sua mensagem, tentarei fazer um exemplo simples em casa e posto para você.

Você tem algum webservice de teste (um publico)

Abraços
rafaelfrocha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qua, 31 Out 2007 9:30 am
Localização: Uberlândia
Rafael Rocha

Olá,

Não tenho nenhum exemplo para te dar, mais sei que você pode fazer da seguinte maneira:

1°) Utilizar o Oracle Jdeveloper para montar uma classe de acesso ao seu webservice (ele faz quase tudo automaticamente).

2°) Importar o Java de acesso para o Oracle. Pesquise como fazer usando o Load Java.

3°) Criar um stored procedure que acessa o Java. Daí você pode usa-lo tanto no banco quanto no Forms.


Rafael
izaiascatelli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Ter, 17 Mai 2005 4:24 pm
Localização: curitiba pr

A rotina abaixo permite ler uma página html

Selecionar tudo

DECLARE
  c  utl_tcp.connection;  -- TCP/IP connection to the Web server
  ret_val pls_integer;
BEGIN
  c := utl_tcp.open_connection(remote_host =>'www.site.com.br', -- remote_host =>
                              remote_port =>  80, --
                              --charset     => 'US7ASCII',
                              tx_timeout  => 5);  -- open connection --  charset     =>

  ret_val := utl_tcp.write_line(c, 'GET / HTTP/1.0');    -- send HTTP request
  ret_val := utl_tcp.write_line(c);
  BEGIN
    LOOP
      dbms_output.put_line(utl_tcp.get_line(c, TRUE));  -- read result
    END LOOP;
  EXCEPTION
    WHEN utl_tcp.end_of_input THEN
      NULL; -- end of input
  END;
  utl_tcp.close_connection(c);
EXCEPTION WHEN OTHERS THEN
   utl_tcp.close_connection(c);
END;
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

só usar utl_http;
rafaelfrocha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qua, 31 Out 2007 9:30 am
Localização: Uberlândia
Rafael Rocha

Não entendi o exemplo acima!

serve para trabalhar com SOAP??
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

Segue um exemplo para se conectar a um webservice via soap, no meu caso este código esta dentro de um loop, pois estou enviando varias notas para o webservice, assim coloco a opção TRUE
no set_persistence, para que ele mantenha a conexão aberta, desta forma não preciso abri-la a cada envio de nota, e na ultima nota eu coloco o set_persistence como false, assim acabando o processo ele fecha automaticamente a conexão.

a variavel WW_ENV possuo o envelope, a mensagem soap completa.

WW_XML, contem todo o valor das notas em xml que estou enviando para o webservice, ou seja lá no webservice no metodo set_notas tem a variavel de entrada Notas.

WW_URL possue o endereço do webservice.

http_req, possue o chamado do webservice.

http_resp possue o valor da resposta do webservice.

Selecionar tudo

WW_ENV:='<?xml version="1.0" encoding="utf-8"?>
              <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://xml.apache.org/xml-soap">
                    <S:Body>
                          <ns2:setNotas xmlns:ns2="http://Serv/">
                                <Cliente>1</Cliente>
                                <Notas>'||WW_XML||'</Notas>
                          </ns2:setNotas>
                    </S:Body>
              </S:Envelope>';
              begin
                    http_req := utl_http.begin_request(WW_URL, 'POST',utl_http.HTTP_VERSION_1_1);
                    utl_http.set_persistent_conn_support(http_req,true);
----Se você setar como TRUE segnifica que a conexão ficará aberta, desta forma você pode acessar o webservice varias vezes sem fechar a conexão aumentando a performance, se for acessa-lo apenas 1 vez então set como false ele fecha a conexão automaticamente.
                    utl_http.set_body_charset(http_req, 'UTF-8');
                    UTL_HTTP.set_authentication(http_req, 'login', 'senha', 'Basic', TRUE );
                    utl_http.set_header(http_req, 'Content-Type', 'text/xml');
                    utl_http.set_header(http_req, 'Content-Length', length(WW_ENV));
                    utl_http.set_header(http_req, 'SOAPAction', 'setNotas');
                    utl_http.write_text(http_req,WW_ENV);

                    http_resp := utl_http.get_response(http_req);

                   IF (http_resp.status_code =utl_http.HTTP_OK ) THEN
                          utl_http.read_text(http_resp, WW_ENV_RESP);
                          utl_http.end_response(http_resp);
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

há a forma de montar o pacote soap varia de webservice para webservice, no meu caso como utilizo um webservice java, que está em um servidor tomcat, então adiciono a tag xmlns:ns2="http://xml.apache.org/xml-soap">
no caso de servidores .net esta tag não é necessaria, mas outras são, ai o melhor é estudar o webservice e como montar o envelope correto para que ele funcione.
e_muniz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qua, 01 Jul 2009 10:35 am
Localização: Belo Horizonte / MG

Shakall, desculpe ressuscitar um tópico antigo, seu código de envio de NFs está faltando alguma parte ?? Como você. anexa a parte de assinatura digital ??

Ats.

Ernandes Muniz
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ

alemds
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 20 Out 2009 9:22 am
Localização: ORLANDIA-SP

bom dia..
alguém tem um exemplo completo de envio de nota fiscal eletronica E ASSINATURA?

OBRIGADA
deniscezar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 27 Ago 2010 12:16 pm
Localização: são paulo - sp

Boa Tarde a todos

Preciso enviar lotes de Nota Fiscal de Serviço e gostaria de saber também se alguém já fez algo parecido gostaria de enviar os lotes através de uma tela no forms ou seja gostaria de fazer tudo através do oracle, hoje a prefeitura de são paulo valida um arquivo txt de notas fiscais de serviço mas existem algumas cidades que exigem o envio através de webservice alguém tem algo como exemplo ? obrigado
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ
Alex Silva
Analista de Sistemas
11i.10 Applications Developer Implementation Champion
11i.10 E-Business Suite Integration Champion

Você quer consumir um webservice com pl/sql?
Se for isso procura por DBMS_WS que vai te atender.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

você tem q montar o seu xml que vai enviar para o seu webservice dinamicamente de forma que suas notas vao ser nodes no teu xml.. essa é a parte dificil.. consumir o serviço vai ser bem mais facil como você pode ver aqui em cima
deniscezar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 27 Ago 2010 12:16 pm
Localização: são paulo - sp

obrigado pelo retorno !!!
montar o xml para mim não seria a parte pior, eu não entendo é como fazer a comunicação e envio do xml através do oracle vocês teriam algum exemplo simples do funcionamento ? um exemplo pegando o arquivo xml e enviando para o webservice da prefeitura ? vocês chegaram fazer isso com alguma prefeitura ?
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ
Alex Silva
Analista de Sistemas
11i.10 Applications Developer Implementation Champion
11i.10 E-Business Suite Integration Champion

Não, não cheguei a fazer com prefeitura.
O que cheguei a fazer foi uma implementação onde eu gerava o xml e gravava em um diretório.
Depois eu ficava monitorando alguns diretórios para pegar os arquivos e gravar no banco.
E já fiz um código pl/sql para consumir WS. Em relação a prefeitura, seria o endpoint que mudaria e o retorno que você tem que tratar.
deniscezar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 27 Ago 2010 12:16 pm
Localização: são paulo - sp

Alex
meus conhecimentos em relação a Webservice no oracle é zero você não tem algo pronto para me passar ? pois fica mais facil em cima do seu fazer as alterações que preciso !!!!
obrigado.
natanclara
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sex, 01 Abr 2011 1:28 am
Localização: linhares - es

Apesar do tempo, verifiquei que ninguém disponibilizou um client oracle. Tenho este que fiz a uns 5 anos atras e funcionou todos estes anos sem problema. Naturalmente os dados so serviço foram trocados para exemplos. Este WS está pronto para HTTPS.

Selecionar tudo

PROCEDURE SP_CONSOMEWS( lido in out varchar2, acpf in varchar2)
is
    req UtL_HTTP.REQ;
    resp UTL_HTTP.RESP;
    l_url varchar2(255) default  'https://ws.serve.com.br/webservices/servico.asmx';
    l_acao varchar2(255) default 'http://tempuri.org/autoriza';
    l_wallet_path varchar2(100);
    envelope  VARCHAR2(32767);
    doc xmltype;
    docfilho xmltype;
    doccampo varchar2(256);
    docvalor varchar2(32767);
begin
    lido := null;
    l_wallet_path := 'file:/opt/oracle/db/chave';
    UTL_HTTP.set_wallet(l_wallet_path,'senhadowaller');
    envelope := '<?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>'||
                    '<autoriza xmlns="http://tempuri.org/">'||
                    '<usuario>joao</usuario>'||
                    '<senha>noisnafaixa</senha>'||
                    '<cpf_cnpj>'||acpf||'</cpf_cnpj>'||
                    '</autoriza>'||
                    '</soap:Body>'||
                    '</soap:Envelope>';

    req := utl_http.begin_request(l_url, 'POST','HTTP/1.0');
    utl_http.set_header(req, 'Content-Type', 'text/xml');
    utl_http.set_header(req, 'Content-Length', length(trim( envelope )));
    utl_http.set_header(req, 'SOAPAction', l_acao);
    utl_http.write_text(req, envelope);
    resp := utl_http.get_response(req);
    utl_http.read_text(resp, envelope);
    utl_http.end_response(resp);
    doc := xmltype.createxml(envelope);
    doc := doc.extract('/soap:Envelope/soap:Body/child::node()', 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"');
    docfilho := doc.extract('/autorizaResponse', 'xmlns="http://tempuri.org/');
    if (docfilho is not null) then
        doccampo := docfilho.extract('/autorizaResponse/AutorizaEmprestimoResult/child::text()',
                                                'xmlns="http://tempuri.org/').getstringval();
    end if;
    lido := doccampo;
exception
    when utl_http.end_of_body then
        utl_http.end_response( resp );
end SP_CONSOMEWS;
deniscezar
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Sex, 27 Ago 2010 12:16 pm
Localização: são paulo - sp

olá natanclara,
você conseguiu assinar seu xml com plsql
tem como mandar um exemplo ?

pois já pesquisei muito e não achei nada a respeito das tag´s

<digestvalue>
<SignatureValue>
<X509Certificate>

no plsql ....

obrigado
Responder
  • Informação