Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Call web service (multipart MIME soap request) using PL/SQL (utl_http)

User478636Oct 13 2014 — edited Oct 21 2014

I was given the following HTTP header and request to call the webservices from PL/SQL.

POST http://deab/DexNETWebServices_4_0_0_4/LoginService.svc HTTP/1.1

MIME-Version: 1.0

Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:e4c19840-745d-45b2-90ca-12d71be4cfd9+id=1";start-info="application/soap+xml"

VsDebuggerCausalityData: uIDPo5F/qXRc4YJImqB6Ard30cQAAAAAAjIXinpIVUulXLJOsSG7yyv7Lf2yHgpHlIxvc6oeqaAACQAA

Host: deab

Content-Length: 1008

Expect: 100-continue

Accept-Encoding: gzip, deflate

Connection: Keep-Alive

--uuid:e4c19840-745d-45b2-90ca-12d71be4cfd9+id=1

Content-ID: <http://tempuri.org/0>

Content-Transfer-Encoding: 8bit

Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://tempuri.org/ILoginService/LoginByUserName</a:Action><a:MessageID>urn:uuid:cf410a05-23d4-4b92-a22c-329cbc19fbe7</a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">http://deab/DexNETWebServices_4_0_0_4/LoginService.svc</a:To></s:Header><s:Body><LoginByUserName xmlns="http://tempuri.org/"><systemId>19e0ddb4-5fa5-41ee-b624-aea762865a6c</systemId><strName>FirmwareUpdateLogQueryWorker</strName><productId>0af39a3e-6549-485b-872f-b73413203998</productId><password>abc</password></LoginByUserName></s:Body></s:Envelope>

--uuid:e4c19840-745d-45b2-90ca-12d71be4cfd9+id=1--

The url works fine in fiddler from both the database machine and my client machine. Fiddler shows the Content-Length as 1004 and the PL/SQL shows it as 998. The UTL_HTTP.get_response from the code below returns the error 400 Bad Request. Can anyone please help?

DECLARE

   l_request         CLOB;

   l_http_req        UTL_HTTP.req;

   l_http_resp       UTL_HTTP.resp;

   v_buffer          VARCHAR2 (32767);

   p_status_code     NUMBER (9);

   p_error_message   VARCHAR2 (32767);

   p_response        CLOB;

BEGIN

   l_request :=

         '--uuid:e4c19840-745d-45b2-90ca-12d71be4cfd9+id=1

Content-ID: <http://tempuri.org/0>

Content-Transfer-Encoding: 8bit

Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://tempuri.org/ILoginService/LoginByUserName</a:Action><a:MessageID>urn:uuid:cf410a05-23d4-4b92-a22c-329cbc19fbe7</a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">http://deab/DexNETWebServices_4_0_0_4/LoginService.svc</a:To></s:Header><s:Body><LoginByUserName xmlns="http://tempuri.org/"><systemId>'

      || '19e0ddb4-5fa5-41ee-b624-aea762865a6c'

      || '</systemId><strName>'

      || 'FirmwareUpdateLogQueryWorker'

      || '</strName><productId>'

      || '0af39a3e-6549-485b-872f-b73413203998'

      || '</productId><password>'

      || 'abc'

      || '</password></LoginByUserName></s:Body></s:Envelope>

--uuid:e4c19840-745d-45b2-90ca-12d71be4cfd9+id=1--';

   DBMS_OUTPUT.put_line ('request ' || l_request);

   l_http_req :=

      UTL_HTTP.begin_request (

         'http://deab/DexNETWebServices_4_0_0_4/LoginService.svc',

         'POST',

         'HTTP/1.1');

   UTL_HTTP.set_header (

      l_http_req,

      'Content-Type',

      'multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:e4c19840-745d-45b2-90ca-12d71be4cfd9+id=1";start-info="application/soap+xml"');

   UTL_HTTP.set_header (l_http_req, 'Content-Length', LENGTH (l_request));

   UTL_HTTP.set_header (l_http_req, 'MIME-Version', '1.0');

   UTL_HTTP.set_header (

      l_http_req,

      'VsDebuggerCausalityData',

      'uIDPo5F/qXRc4YJImqB6Ard30cQAAAAAAjIXinpIVUulXLJOsSG7yyv7Lf2yHgpHlIxvc6oeqaAACQAA');

   UTL_HTTP.write_text (l_http_req, l_request);

   DBMS_LOB.createtemporary (p_response, FALSE);

   l_http_resp := UTL_HTTP.get_response (l_http_req);

   BEGIN

      LOOP

         UTL_HTTP.read_text (l_http_resp, v_buffer, 32767);

         DBMS_OUTPUT.put_line (v_buffer);

         DBMS_LOB.writeappend (p_response, LENGTH (v_buffer), v_buffer);

      END LOOP;

   EXCEPTION

      WHEN UTL_HTTP.end_of_body

      THEN

         NULL;

   END;

   UTL_HTTP.end_response (l_http_resp);

   p_status_code := l_http_resp.status_code;

   p_error_message := l_http_resp.reason_phrase;

   p_response := REPLACE (p_response, '&lt;', '<');

   p_response := REPLACE (p_response, '&gt;', '>');

   DBMS_OUTPUT.put_line (

      'Status: ' || p_status_code || '-' || p_error_message || ': ' || p_response);

END;

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 18 2014
Added on Oct 13 2014
2 comments
1,276 views