Я подключаюсь к 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(), '<', '<'), '>', '>'), 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;