Способ отключить Multipart / MTOM при возврате через веб-сервис - PullRequest
0 голосов
/ 20 февраля 2019

Я подключаюсь к Fusion / Oracle Cloud ERP WebService с процедурами PL / SQL, один из которых использует APEX API APEX_WEB_SERVICE, а другой - пакет UTL_HTTP.

При тестировании запроса и ответа веб-службы с помощью SOAPUI он возвращает XML, и одним из тегов является другой XML, закодированный в base64, который становится одной большой строкой.

Использование процедур PL / SQLвеб-служба отвечает на запрос с помощью XML, но декодирует вторичный XML и информирует заголовки http для многокомпонентного контента, так что становится невозможным использование функции make_request из API APEX_WEB_SERVICE (поскольку возвращаемая функция является правильно сформированной XMLTYPE) и требуя много работы для «очистки» возврата сгустка из пакета UTL_HTTP.

Анализируя свойства SOAPUI, я вижу, что некоторые свойства ссылаются на Включить (или нет) MTOM, Force (илинет) MTOM, отключение нескольких частей и т. д.

Есть ли заголовок http или какой-либо тип аргумента, который я могу отправить для отключения нескольких частей / MTOM?

мой код

APEX_WEB_SERVICEAPI:

create or replace procedure prc_teste_webservice is
  l_envelope  CLOB;
  l_xml       XMLTYPE;
  l_result    VARCHAR2(32767);
  l_result_clob clob;
  v_txt    VARCHAR2(32767);
BEGIN

  -- Build a SOAP document appropriate for the web service.
  l_envelope := '<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ucm="http://www.oracle.com/UCM">
   <soapenv:Header/>
   <soapenv:Body>
      <ucm:GenericRequest webKey="cs">
         <ucm:Service IdcService="GET_FILE">
            <ucm:Document>
               <ucm:Field name="dID">33333</ucm:Field>
            </ucm:Document>
         </ucm:Service>
      </ucm:GenericRequest>
   </soapenv:Body>
</soapenv:Envelope>';

  l_xml := APEX_WEB_SERVICE.make_request(
    p_url      => 'https://host/idcws/GenericSoapPort',
    p_action   => 'GenericSoapOperation', 
    p_username => '*************',
    p_password => '*************',
    p_wallet_path => 'file:c:\app\Administrator\product\12.1.0\dbhome_1\wallet\',
    p_wallet_pwd => '************',
    p_envelope => l_envelope
  );

  l_result_clob := 'abcdefghij';

  -- Display the whole SOAP document returned.
  DBMS_OUTPUT.put_line('l_xml=' || l_xml.getClobVal());
  l_result_clob := l_xml.getClobVal();
  l_xml := xmltype.createxml(replace(replace(replace(replace(l_xml.getClobVal(), '&lt;', '<'), '&gt;', '>'), chr(13), ''), chr(10), ''));


  DBMS_OUTPUT.put_line('l_xml=' || l_result_clob);

END prc_teste_webservice;

UTL_HTTP:

create or replace procedure prc_wallet2 is
  l_envelope  CLOB;
  l_xml       XMLTYPE;
  l_result    VARCHAR2(32767);
  l_result_clob clob;
  v_txt    VARCHAR2(32767);
    soap_respond  CLOB;
    http_req      utl_http.req;
    http_resp     utl_http.resp;
    resp          XMLType;
    soap_err      exception;
    v_code        VARCHAR2(200);
    v_msg         VARCHAR2(1800);
    v_len number;
    v_txt Varchar2(32767);
BEGIN
  -- Build a SOAP document appropriate for the web service.
  l_envelope := '<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ucm="http://www.oracle.com/UCM">
   <soapenv:Header/>
   <soapenv:Body>
      <ucm:GenericRequest webKey="cs">
         <ucm:Service IdcService="GET_FILE">
            <ucm:Document>
               <ucm:Field name="dID">33333</ucm:Field>
            </ucm:Document>
         </ucm:Service>
      </ucm:GenericRequest>
   </soapenv:Body>
</soapenv:Envelope>';

  -- Make a HTTP request and get the response.
  utl_http.set_wallet('file:c:\app\Administrator\product\12.1.0\dbhome_1\wallet\', Null);
--  l_http_request  := UTL_HTTP.begin_request('https://www.google.com');
    http_req:= utl_http.begin_request
              ( 'https://host/idcws/GenericSoapPort'
              , 'POST'
              , 'HTTP/1.1'
              );
    UTL_HTTP.set_authentication(http_req, '******************', '*****************');
    utl_http.set_header(http_req, 'Content-Type', 'text/xml');
    utl_http.set_header(http_req, 'Content-Length', length(l_envelope));
    utl_http.set_header(http_req, 'SOAPAction', 'urn:GenericSoap/GenericSoapOperation');
    utl_http.write_text(http_req, l_envelope);


  http_resp := UTL_HTTP.get_response(http_req);

  -- Loop through the response.
  BEGIN
    LOOP
      UTL_HTTP.read_text(http_resp, l_result_clob);
      pkg_java.java_file_clob('c:\temp\teste1.txt', l_result_clob);
    END LOOP;
  EXCEPTION
    WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response(http_resp);
  END;
EXCEPTION
  WHEN OTHERS THEN
    UTL_HTTP.end_response(http_resp);
    RAISE;

end prc_wallet2;
...