Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle UTL_HTTP पोस्ट मल्टीपार्ट/फॉर्म-डेटा (JSON &ZIP) उदाहरण

यहां मैं JSON और एक ज़िप फ़ाइल को REST . पर भेजने के लिए एक उदाहरण दे रहा हूं Oracle का उपयोग कर वेब सेवा UTL_HTTP मल्टीपार्ट/फॉर्म-डेटा पोस्ट करें।

प्रारंभ में, मैंने Nick Buytaert के ब्लॉग से उदाहरण कोड लिया और फिर इसे JSON शामिल करने के लिए संशोधित किया। और ज़िप फ़ाइल।

UTL_HTTP का उपयोग करके JSON और Zip फ़ाइल को REST वेब सेवा पर भेजें

निम्नलिखित PL/SQL कोड REST करेगा वेब सेवा प्रमाणीकरण टोकन का उपयोग कर। और उसके बाद उसे JSON मिलेगा और टेबल से बीएलओबी। यह BLOB को ज़िप कर देगा और फिर इसे JSON . के साथ संयोजित करें इसे base64 . में कनवर्ट करके डेटा टाइप करें। फिर यह हैडर तैयार कर भेज देगा।

declare
l_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
-- get the token
l_clob := apex_web_service.make_rest_request(
 p_url => 'https://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'); 

-- prepare or get the json
l_req_body := '{name: "Scott", age: 33, city: "Huston"}';

l_request_body := l_newline
|| '--' || lco_boundary || l_newline
|| 'Content-Disposition: form-data; name="contact-info"' || l_newline
|| 'Content-Type: application/json' || l_newline
|| l_newline
|| l_req_body; --|| l_newline
--|| '--' || lco_boundary || '--';

-- get the blob from the table and zip it
FOR l_file IN (
SELECT
file_name,
my_file_blob
FROM
my_doc_table
WHERE
doc_id = '1234'
) LOOP
apex_zip.add_file(p_zipped_blob => l_attachment, p_file_name => l_file.file_name,
p_content => l_file.my_file_blob);
END LOOP;

apex_zip.finish(p_zipped_blob => l_attachment);

-- concatenate zip file as base64 data to the above json
l_request_body := l_request_body || l_newline
|| '--' || lco_boundary || l_newline
|| 'Content-Disposition: form-data; name="attachment"' || l_newline
|| 'Content-Type: application/zip' || l_newline
|| 'Content-Transfer-Encoding: base64' || l_newline
|| l_newline
|| apex_web_service.blob2clobbase64(l_attachment) || l_newline
|| '--' || lco_boundary || '--';

dbms_output.put_line('Request body>');
dbms_output.put_line(dbms_lob.substr(l_request_body, 4000, 1));

l_request_body_length := dbms_lob.getlength(l_request_body);

-- authenticate wallet
utl_http.set_wallet(
path => 'file:/your/wallet/path',
password => 'YourWalletPsw'
);

-- start sending the data
l_http_request := utl_http.begin_request(
url => 'https://yourRESTservicePostURL',
method => 'POST',
http_version => 'HTTP/1.1'
);

-- set header
utl_http.set_header(l_http_request, 'Authorization', 'Bearer ' || l_token);
utl_http.set_header(l_http_request, 'Content-Type', 'multipart/form-data; boundary="' || lco_boundary || '"');
utl_http.set_header(l_http_request, 'Content-Length', l_request_body_length);
utl_http.set_header(l_http_request, 'Transfer-Encoding', 'Chunked');
utl_http.set_header(l_http_request, 'Connection', 'keep-alive');

-- send data in chunks
while l_offset < l_request_body_length loop
dbms_lob.read(l_request_body, l_amount, l_offset, l_buffer);
utl_http.write_text(l_http_request, l_buffer);
l_offset := l_offset + l_amount;
end loop;

-- print the response 
l_http_response := utl_http.get_response(l_http_request);
dbms_output.put_line('Response> Status Code: ' || l_http_response.status_code);
dbms_output.put_line('Response> Reason Phrase: ' || l_http_response.reason_phrase);
dbms_output.put_line('Response> HTTP Version: ' || l_http_response.http_version);

for i in 1 .. utl_http.get_header_count(l_http_response) loop
utl_http.get_header(l_http_response, i, l_response_header_name, l_response_header_value);
dbms_output.put_line('Response> ' || l_response_header_name || ': ' || l_response_header_value);
end loop;

utl_http.read_text(l_http_response, l_response_body, 32767);
dbms_output.put_line('Response body>');
dbms_output.put_line(l_response_body);

if l_http_request.private_hndl is not null then
utl_http.end_request(l_http_request);
end if;

if l_http_response.private_hndl is not null then
utl_http.end_response(l_http_response);
end if;
exception
when others then
if l_http_request.private_hndl is not null then
utl_http.end_request(l_http_request);
end if;

if l_http_response.private_hndl is not null then
utl_http.end_response(l_http_response);
end if;

raise;
end;

यह कोड एक आकर्षण की तरह काम करता है। अगर आपको कोई समस्या है तो कृपया मुझे कमेंट सेक्शन में बताएं।

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. केवल समय कैसे स्टोर करें; तारीख और समय नहीं?

  2. ऑरैकल डेटाबेस में तालिका का नाम बदलें कॉलम बदलें

  3. ओरेकल फॉर लूप सेलेक्ट स्टेटमेंट उदाहरण

  4. ORA-00979 व्यंजक द्वारा समूह नहीं है

  5. Oracle में UTF8 वर्ण सेट को कैसे कॉन्फ़िगर करें?