понедельник, 24 августа 2009 г.

Как вызвать ВебСервис из базы Oracle

Самый простой способ - воспользоваться UTL_HTTP:


declare
http_req utl_http.req;
http_resp utl_http.resp;
request_env varchar2(32767);
response_env varchar2(32767);
begin
request_env:='Твой SOAP запрос в виде текста XML';
dbms_output.put_line('Length of Request:' || length(request_env));
dbms_output.put_line ('Request: ' || request_env);
http_req := utl_http.begin_request('http://a05198:8080/afm_register_mileage/services/AfmRegisterMileage', 'POST', utl_http.HTTP_VERSION_1_1);
utl_http.set_authentication(r => http_req,
username => 'LOGIN',
password => 'PASSWoRD',
scheme => 'Basic',
for_proxy => FALSE);
utl_http.set_header(http_req, 'Content-Type', 'text/xml; charset=utf-8');
utl_http.set_header(http_req, 'Content-Length', length(request_env));
--utl_http.set_header(http_req, 'SOAPAction', '"http://tempuri.org/LogMessage"');
utl_http.write_text(http_req, request_env);
dbms_output.put_line('1');
http_resp := utl_http.get_response(http_req);
dbms_output.put_line('Response Received');
dbms_output.put_line('--------------------------');
dbms_output.put_line ( 'Status code: ' || http_resp.status_code );
dbms_output.put_line ( 'Reason phrase: ' || http_resp.reason_phrase );
utl_http.read_text(http_resp, response_env);
dbms_output.put_line('Response: ');
dbms_output.put_line(response_env);
utl_http.end_response(http_resp);

resp := xmltype.createxml(response_env);
resp := resp.extract('/soapenv:Envelope/soapenv:Body/ns1:response/ns1:status/text()',
'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/ xmlns:ns1="http://www.energia.ee/archibus/AfmRegisterMileage');
if(resp IS NULL) then
DBMS_OUTPUT.put_line ('NOK');
else
DBMS_OUTPUT.put_line ('OK!!!');
DBMS_OUTPUT.put_line (resp.getStringVal());
end if;

end;


Существуют и другие, "более гибкие" способы, например через JPublisher, UTL_DBWS, но мне кажется , что вышеописанный пример проще.