Nachdem das Thema REST immer mehr an Schwung gewinnt, wird es Zeit darüber einen Tipp zu schreiben.
Wir haben aus eigener Erfahrung lange im Internet gesucht und nur selten etwas gefunden.
Deswegen haben wir ein paar Beispiele gesammelt:
Der Einfachheit halber, wird mit nicht mit SSL Verschlüsselung gearbeitet, ansonsten muss noch ein Wallet eingerichtet werden
1. CLOB Übertragen (upload)
l_clob:=APEX_WEB_SERVICE.MAKE_REST_REQUEST(
p_url=>'http://www.muniqsoft-training.de/ords/my_rest/muso/putCLOB',
p_http_method =>'PUT',
p_transfer_timeout =>720,
p_username =>'rest_user',
p_password =>'rest_password'
p_body =>text_lob, --CLOB Datentyp übertragen
);
Hinweis: p_body darf nur bei PUT und POST Request übertragen werden !
Auf dem Zielserver dann einen Rest-Service anlegen (Typ PUT):
BEGIN
my_proc(:body_text);
END;
Die Procedure my_proc könnte dann wie folgt aussehen:
CREATE OR REPLACE PROCEDURE my_proc (p_clob IN CLOB)
IS
...
BEGIN
...
END;
2. BLOB übertragen (upload)
l_clob:=APEX_WEB_SERVICE.MAKE_REST_REQUEST(
p_url=>'http://www.muniqsoft-training.de/ords/my_rest/muso/putBLOB',
p_http_method =>'PUT',
p_transfer_timeout =>720,
p_username =>'rest_user',
p_password =>'rest_password'
p_body_blob =>pdf_lob, --BLOB Datentyp übertragen
);
Auf dem Zielserver dann einen Rest-Service anlegen (Typ PUT):
BEGIN
my_proc(:body);
END;
Die Procedure my_proc könnte dann wie folgt aussehen:
CREATE OR REPLACE PROCEDURE my_proc (p_blob IN BLOB)
IS
...
BEGIN
...
END;
3. Zwei Parameter übertragen (Upload)
DECLARE
l_clob CLOB;
BEGIN
apex_web_service.g_request_headers.delete();
apex_web_service.g_request_headers(1).name := 'Content-Type';
apex_web_service.g_request_headers(1).value := 'application/octet-stream'; --'application/x-www-form-urlencoded';
apex_web_service.g_request_headers(2).name := 'PARAMETER_A';
apex_web_service.g_request_headers(2).value := '12345';
apex_web_service.g_request_headers(3).name := 'PARAMETER_B';
apex_web_service.g_request_headers(3).value := to_char(sysdate,'DD.MM.YYYY');
l_clob:=APEX_WEB_SERVICE.MAKE_REST_REQUEST(
p_url=>'http://www.muniqsoft-training.de/ords/my_rest/muso/putDATA',
p_http_method =>'PUT',
p_transfer_timeout =>180,
p_username =>'rest_user',
p_password =>'rest_passwort',
p_body =>my_clob_text);
if apex_web_service.g_status_code = 200 then
dbms_output.put_line('Übertragung erfolgreich abgeschlossen.');
else
dbms_output.put_line('Fehler aufgetreten: ' || apex_web_service.g_status_code);
end if;
END;
Auf dem Zielserver dann wieder ein REST Service anlegen (TYP: PUT)
BEGIN
:status:=my_func(
p_parameter1=>:PARAMETER_A,
p_parameter1=>:PARAMETER_A,
p_clob=>:BODY_TEXT);
END;
REST Parameter:
Name | Bind-Parameter | Zugriffm. | Quelltyp | Datentyp |
PARAMETER_A | PARAMETER_A | IN | HTTP HEADER | STRING |
PARAMETER_B | PARAMETER_B | IN | HTTP HEADER | STRING |
STATUS | STATUS | OUT | RESPONSE | STRING |
Die Funktion könnte dann wie folgt aussehen:
CREATE OR REPLACE FUNCTION my_func(
p_parameter1 IN VARCHAR2,
p_parameter2 IN VARCHAR2,
p_clob IN CLOB) RETURN VARCHAR2
IS
BEGIN
...
RETURN 200;
EXCEPTION WHEN OTHERS THEN
RETURN 500;
END;
Wenn Sie Parameter aus dem Rest-Service zurückgeben möchten, definieren Sie sie einfach als OUT (wie Status im obigen Beispiel)
und können Sie dann nach dem apex_web_service Aufruf wieder abfangen mit:
for i in 1..apex_web_service.g_headers.count loop
dbms_output.put_line(
apex_web_service.g_headers(i).name||'='||apex_web_service.g_headers(i).value);
end loop;