Zde uvádím příklad odeslání JSON a souboru Zip do REST
webové služby využívající Oracle UTL_HTTP
post multipart/form-data.
Nejprve jsem vzal ukázkový kód z blogu Nicka Buytaerta a poté jej upravil tak, aby obsahoval JSON
a soubor ZIP.
Odeslat JSON a soubor Zip do webové služby REST pomocí UTL_HTTP
Následující kód PL/SQL provede REST
autentizace webové služby pomocí tokenu. A poté získá JSON
a BLOB ze stolu. Zkomprimuje BLOB
a poté jej zkombinujte s JSON
převedením na base64
typová data. Poté připraví hlavičku a odešle ji.
declarel_attachment blob;l_newline varchar2(50) :=chr(13) || chr(10);lco_boundary constant varchar2(30) :='gc0p4Jq0M2Yt08jU534c0p';l_http_request utl_http.req;l_request_body clob;l_request_body_length number;l_req_body clob;l_http_response utl_http.resp;l_response_header_name varchar2(256);l_response_header_value varchar2(1024);l_response_body varchar2 (32767);l_offset number :=1;l_amount number :=2000;l_buffer varchar2(2000);l_clob clob;l_token varchar2(32767);begin-- získat tokenl_clob :=apex_web_service.make_url_request =( /YourTokenURL', p_http_method => 'GET'); l_status :=apex_web_service.g_status_code;APEX_JSON.parse(l_clob);l_token:=APEX_JSON.get_varchar2(p_path => 'token'); -- připravit nebo získat jsonl_req_body :='{jméno:"Scott", věk:33, město:"Huston"}';l_request_body :=l_newline|| '--' || lco_boundary || l_nový řádek|| 'Obsah-Dispozice:formulář-data; name="contact-info"' || l_nový řádek|| 'Typ obsahu:application/json' || l_nový řádek|| l_nový řádek|| l_req_body; --|| l_nový řádek--|| '--' || lco_boundary || '--';-- získejte objekt blob z tabulky a zazipujte jej PRO l_file IN (SELECTfile_name,my_file_blobFROMmy_doc_tableWHEREdoc_id ='1234') LOOPapex_zip.add_file(p_zipped_blob => l_attachment_name, p_file_name, p_file_name, p_file_name, p_file_name, p_file_tent.;END LOOP;apex_zip.finish(p_zipped_blob => l_attachment);-- zřetězit soubor zip jako data base64 k výše uvedenému jsonl_request_body :=l_request_body || l_nový řádek|| '--' || lco_boundary || l_nový řádek|| 'Obsah-Dispozice:formulář-data; name="attachment"' || l_nový řádek|| 'Typ obsahu:aplikace/zip' || l_nový řádek|| 'Content-Transfer-Encoding:base64' || l_nový řádek|| l_nový řádek|| apex_web_service.blob2clobbase64(l_attachment) || l_nový řádek|| '--' || lco_boundary || '--';dbms_output.put_line('Tělo požadavku>');dbms_output.put_line(dbms_lob.substr(l_tělo_požadavku, 4000, 1));l_request_body_length :=dbms_lob.getlength(l_request_body);--wallet.cesta walletutl. => 'file:/your/wallet/path',password => 'YourWalletPsw');-- začněte odesílat požadavek datal_http_request :=utl_http.begin_request(url => 'https://yourRESTservicePostURL',method => 'POST' ,http_version => 'HTTP/1.1');-- set headerutl_http.set_header(l_http_request, 'Autorizace', 'Bearer ' || l_token);utl_http.set_header(l_http_request, 'Content-Type', 'multipart/form; boundary="' || lco_boundary || '"');utl_http.set_header(l_http_request, 'Content-Length', l_request_body_length);utl_http.set_header(l_http_set_request, 'Transfer-Encoding', 'Chunked.'_header (l_http_request, 'Connection', 'keep-alive');-- odesílání dat po částech, zatímco l_offsetStatus Code:' || l_http_response.status_code);dbms_output.put_line('Odpověď> Fráze důvodu:' || l_http_response.reason_phrase);dbms_output.put_line('Odpověď> Verze HTTP:' || l_http_response.http_1head_count.count utl.počet utl. (l_http_response) looputl_http.get_header(l_http_response, i, l_response_header_name, l_response_header_value);dbms_output.put_line('Response> ' || l_response_header_name || ':spon_response_header_name, ':spon_retext_http;ut_head_http;;dbms_output.put_line('Tělo odpovědi>');dbms_output.put_line(l_response_body);if l_http_request.private_hndl není null thenutl_http.end_request(l_httpre_request);end if;if;if l_http_response_response_nellhttp_response_private_hndl. end if;exceptionwhen others thenif l_http_request.private_hndl není null thenutl_http.end_request(l_http_request);end if;if;if l_http_response.private_hndl není null thenutl_http.end_response(l_http_response);end if;; Tento kód funguje jako kouzlo. Pokud máte nějaké problémy, dejte mi prosím vědět v sekci komentářů.