Toon posts:

[Oracle]data verzenden via http/utl.tcp

Pagina: 1
Acties:

Verwijderd

Topicstarter
Kan iemand mij misschien vertellen hoe ik vanuit een Oracle procedure het volgende kan doen:
Er moet een externe applicatie worden aangeroepen via het http protocol.
Hierbij moet een gevulde parameter worden meegestuurd.
Zoiets als http ://webadres.externeapplicatie.nl?OracleParameter=WaardeOracleParamater.
Dit moet dus vanuit een Oracle Procedure gebeuren.

Ik heb het o.a. met utl.tcp geprobeerd, maar die doet niet helemaal wat ik wil.
Deze maakt namelijk eerst een verbinding (dit werkt, ik krijg response terug) en vervolgens kun je gegevens gaan versturen. Alleen verwacht de externe applicatie gelijk die gegevens.
Het moet dus in 1 keer gebeuren.

Situatie
Nu:
Maak verbinding.
Stuur parametergegevens.
Sluit verbinding.

Bedoeling:
Roep url aan en stuur de parametergegevens mee.

  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

gebruik utl.http, een voorbeeld:

-- Private constant declarations
G_URL constant varchar2(2000)
:= 'http://ebbl.aegon.nl/nieuws/Aegon_opties_N.htm';


-- Retrieves a quote, based on an url.
function get_quote return number is

-- formatting will be 'euro (x)xx.xx' --> l_chars:= 10
l_start number;
l_chars number := 10;
l_tmp_string varchar2(500);
l_occurence_counter number :=0;
l_result varchar2(255);
l_web_page utl_http.html_pieces;
l_converted_number number;

begin
-- get me the ticker page.
l_web_page := utl_http.request_pieces(url => G_URL);

for i in 1..l_web_page.COUNT

-- Start analyzer...
loop
l_start := instr(upper(l_web_page(i)), 'EURO');
if l_start > 0 and l_occurence_counter < 1
then
-- When the first euro occurence has been found, we have found the
-- actual stock value.
l_occurence_counter := l_occurence_counter + 1;

-- fetch the word euro and the 10 following chars...
l_tmp_string := substr(l_web_page(i), l_start, l_chars );

-- ... search the result for a comma and extract: xxx,xx.
l_result := substr(l_tmp_string, instr(l_tmp_string, ',' )-3, 6);

begin -- Sanity Check.
l_converted_number := to_number(l_result, '999D99', ' NLS_NUMERIC_CHARACTERS = '',.''');
return l_converted_number;

exception
when others
then
--htp.p('Result String is no longer in format: euro (x)xx,xx');
--htp.p('Possible cause: Change of web page design');
--htp.p('Error message : '||sqlerrm);
return 0;
end;

end if;

end loop;

-- If bad things happen..
exception
when UTL_HTTP.INIT_FAILED
then
htp.p('Initialization of the HTTP-callout subsystem fails (for environment
al reasons, such as lack of available memory)');
htp.p('Error message: '||sqlerrm);

when UTL_HTTP.REQUEST_FAILED
then
htp.p('The HTTP call failed.');
htp.p('Possible cause: The url '||G_URL||' changed');
htp.p('Error message: '||sqlerrm);

when others
then
htp.p('Something went wrong in get_aegon_quote: '||sqlerrm);

end get_quote;

specs


Verwijderd

Topicstarter
Ik kende deze manier al, maar volgens mij is dit om bestaande webcontent (urls) in te lezen in Oracle toch?
Toch bedankt voor je reactie.

Ik heb verder geen invloed op de externe applicatie.
Er wordt door die applicatie, die ik via het 'http protocol' moet aanroepen, een parameter verwacht.

Deze externe applicatie gaat dan a.d.h.v. van de parameter wat gegevens ophalen die hij dan weer terugstuurt dmv het aanroepen van 1 van mijn Oracle Procedures.

Mijn probleem is, hoe zeg ik in een procedure: Post deze variabele even naar die externe applicatie via http.

Normaal via ODBC, JDBC, TNS etc geeft dit geen problemen, alleen moet het nu dus via http.

  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

Misschien begrijp ik je verkeerd, maar met het bovenstaande voorbeeld kan je wel degelijk parameters meegeven. Je kan een url in elkaar sleutelen door een string op te bouwen en deze door te geven.

Dus ergens in je procedure/functie/methode/etc.. creeer de de parameters, vervolgens plak je deze aan de url die je aan moet roepen; verstuur het request.. Klaar.

Bijvoorbeeld:
l_url varchar2(100):= 'http://www.oracle.com'
l_p1 varchar2(100) := 'p1=aap';
l_p2 varchar2(100) := 'p2=smurf';
l_request varchar2(2000);

l_request := l_url||'?'||l_p1||'&'||l_p2;

l_web_page := utl_http.request_pieces(l_request);

(de waardes kunnen uiteraard ook programatisch worden afgeleid door cursoren of andere business logica).

utl_http.html_pieces zorgt ervoor dat je het antwoord weer kan analyseren, maar dat hoeft natuurlijk niet. Als je de andere server ok ofzo kan laten teruggeven, is dat ook prima. Voor alternatieven voor utl_http.html_pieces, moet je even de manual bekijken (zie technet.oracle.com).

Met utl.http kan je een url versturen en wat met de response doen, utl.tcp werkt met tcp/ip. Jij wil een url versturen, dus gebruik utl.http.

specs


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als je het url met GET aan kunt roepen (zoals je eigenlijk in je vraagstelling al zegt) dan is utl_http de juiste oplossing.

Als het url alleen via een POST opdracht opgehaald kan worden dan wordt het lastiger.
In dat geval kun je utl_tcp gebruiken om zelf het http request op te stellen of je kunt de java http classes uit de database gebruiken.

Who is John Galt?


Verwijderd

Topicstarter
Ik zal het morgen nog eens gaan proberen.
Op zich klinkt het wel logisch allemaal, en ik kan me ook niet voorstellen dat Oracle de mogelijkheid niet zou hebben.
Ik kon het alleen niet zo snel vinden.
't Nadeel is dat ik geen enkele invloed heb op de externe applicatie.
Maar het gaat lukken, uiteindelijk :)

  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

Op maandag 13 mei 2002 21:42 schreef justmental het volgende:
Als je het url met GET aan kunt roepen (zoals je eigenlijk in je vraagstelling al zegt) dan is utl_http de juiste oplossing.

Als het url alleen via een POST opdracht opgehaald kan worden dan wordt het lastiger.
In dat geval kun je utl_tcp gebruiken om zelf het http request op te stellen of je kunt de java http classes uit de database gebruiken.
Volgens mij vergis je je hoor :). TCP en HTTP zijn verschillende protocollen: http heeft een get en een post en is stateless (na iedere request is de verbinding als het ware verbroken). TCP is stateful (dus behoudt zijn connectie).

Maar ik ben op dit moment te lui om het na te zoeken in de docs, dus ik ga er geen 'ruzie' om maken. ;)

specs


  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

Op maandag 13 mei 2002 21:48 schreef SGBas het volgende:
Ik zal het morgen nog eens gaan proberen.
Op zich klinkt het wel logisch allemaal, en ik kan me ook niet voorstellen dat Oracle de mogelijkheid niet zou hebben.
Ik kon het alleen niet zo snel vinden.
't Nadeel is dat ik geen enkele invloed heb op de externe applicatie.
Maar het gaat lukken, uiteindelijk :)
Hoezo nie? Je kan toch een procedure aanroepen van de externe applicatie die iets gaat uitvoeren, waarna de server je antwoord geeft? In principe roep je een functie aan met parameters en de server gaat daar wat mee doen. Je hebt wel degelijk invloed op de applicatie.

Je hebt alleen geen stateful verbinding.

specs


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op maandag 13 mei 2002 22:08 schreef Laszlo het volgende:
Volgens mij vergis je je hoor :). TCP en HTTP zijn verschillende protocollen: http heeft een get en een post en is stateless (na iedere request is de verbinding als het ware verbroken). TCP is stateful (dus behoudt zijn connectie).

Maar ik ben op dit moment te lui om het na te zoeken in de docs, dus ik ga er geen 'ruzie' om maken. ;)
O yee of little faith :+

http://asktom.oracle.com/pls/ask/f?p=4950:8:809561::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1224436374644,%7Butl_http%7D%20and%20%7Bpost%7D

Who is John Galt?


  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

Jaaaaaa maar dat was 'vroeger': Version 8.1.6 :+, maar ja je hebt gelijk voor versie 8.1.6.

specs


  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

Update:

Ik kon niet zo snel vinden of een post nu wel werkt in 9i, maar hier heb je de documentatie over de package:

http://otn.oracle.com/docs/products/oracle9i/doc_library/901_doc/appdev.901/a89852/utl_http.htm#998100

Nu moet je er wel uit kunnen komen denk ik! :)

specs


Verwijderd

Topicstarter
Het werkt nu wel.
Alleen wil het niet met een string.
Deze wordt na de eerste spatie afgebroken.
Vanuit de browser (IE) wordt er automatisch %20 toegevoegd.
Natuurlijk kan ik alle spaties replacen, maar is er ook een andere oplossing voor?

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 09:27
Op dinsdag 14 mei 2002 07:49 schreef SGBas het volgende:
Het werkt nu wel.
Alleen wil het niet met een string.
Deze wordt na de eerste spatie afgebroken.
Vanuit de browser (IE) wordt er automatisch %20 toegevoegd.
Natuurlijk kan ik alle spaties replacen, maar is er ook een andere oplossing voor?
Het is echt jaren geleden dat ik iets met WAS gedaan heb, maar ik kan me nog wel herinneren dat er een standaard package bestaat waarmee je dit soort simpele 'html-escaping' kan doen.

[edit], en jawel hij bestaat nog steeds : http://download-west.oracle.com/otndoc/oracle9i/901_doc/appdev.901/a89852/u_url2.htm#1001646

  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

Op dinsdag 14 mei 2002 07:49 schreef SGBas het volgende:
Het werkt nu wel.
Alleen wil het niet met een string.
Deze wordt na de eerste spatie afgebroken.
Vanuit de browser (IE) wordt er automatisch %20 toegevoegd.
Natuurlijk kan ik alle spaties replacen, maar is er ook een andere oplossing voor?
In sqlplus kan je gebruik maken van gebruik substr en replace.

specs


Verwijderd

Topicstarter
Het werkt nu allemaal, maar :)

Het is de bedoeling dat die externe applicatie een xmldom.domdocument datatype als parameter krijgt.

Nu kan ik dus helemaal niets vinden over hoe je dit zou moeten doen.
Iemand een idee?

utl_http en utl_tcp ondersteunen voor zover ik weet en geprobeerd heb alleen maar varchar2 of raw.
Pagina: 1