Hi!
I would like to Post a binary file (and some parameters in URL) to a Web Services via an Oracle Apex 4.2 form.
I'm trying to made an HTTP Post of a binary file with a PL/SQL Function, but I receive this error from the WebServices as response:
HTTP 400 Bad Request Error
I've checked the URL and seems to be well-formed: if I try to make the same request without the file (with only parameters in URL), works fine.. but I would like to post the file too...
This is my code:
FUNCTION POST(URL VARCHAR2, DATA_IN BLOB, HTTPS BOOLEAN DEFAULT FALSE) RETURN CLOB IS
BEGIN
DECLARE
DATA_OUT CLOB;
PIECE VARCHAR2(4000);
--AMT PLS_INTEGER := 4000;
--POS PLS_INTEGER := 1;
HTTP_REQ UTL_HTTP.REQ;
HTTP_RESP UTL_HTTP.RESP;
BUFFER RAW(32767);
AMOUNT PLS_INTEGER := 4000;
REQ_LENGTH INT:=0;
OFFSET INT:=1;
-- Variables to handle the web service response
L_RESPONSE CLOB;
L_BUFFER VARCHAR2(4000);
request_contest utl_http.request_context_key;
BEGIN
IF HTTPS THEN
--UTL_HTTP.SET_WALLET(C_WALLET_PATH, null);
request_contest:=utl_http.create_request_context(
wallet_path => C_WALLET_PATH,
wallet_password => null,
enable_cookies => false,
max_cookies => 0,
max_cookies_per_site => 0 );
HTTP_REQ := utl_http.begin_request(URL,'POST','HTTP/1.1', request_contest);
UTL_HTTP.SET_TRANSFER_TIMEOUT(HTTP_REQ, 300);
ELSE
HTTP_REQ := UTL_HTTP.BEGIN_REQUEST (URL, 'POST');
END IF;
REQ_LENGTH := DBMS_LOB.GETLENGTH(DATA_IN);
UTL_HTTP.SET_HEADER(HTTP_REQ, 'User-Agent', 'Mozilla/4.0');
UTL_HTTP.SET_HEADER(HTTP_REQ, 'content-type', 'application/octet-stream');
UTL_HTTP.SET_HEADER(HTTP_REQ, 'content-length', REQ_LENGTH);
-----------------------------------------------------------------------------------------
-- Authentication is not required
-----------------------------------------------------------------------------------------
-- IF HTTPS THEN
-- UTL_HTTP.SET_AUTHENTICATION(HTTP_REQ, C_AUTH_USER, C_AUTH_PWD);
-- -- UTL_HTTP.SET_AUTHENTICATION(HTTP_REQ, C_AUTH_USER, C_AUTH_PWD, 'Basic', FALSE);
-- END IF;
-----------------------------------------------------------------------------------------
IF REQ_LENGTH <= 32767 THEN
UTL_HTTP.SET_HEADER(HTTP_REQ, 'Content-Length', REQ_LENGTH);
UTL_HTTP.WRITE_RAW(HTTP_REQ, DATA_IN);
ELSIF REQ_LENGTH >32767 THEN
UTL_HTTP.SET_HEADER(HTTP_REQ, 'Transfer-Encoding', 'Chunked');
WHILE (OFFSET <= REQ_LENGTH)
LOOP
DBMS_LOB.READ(DATA_IN, AMOUNT, OFFSET, BUFFER);
UTL_HTTP.WRITE_RAW(HTTP_REQ, BUFFER);
OFFSET := OFFSET + AMOUNT;
END LOOP;
END IF;
---------------------------------------------------------------------------------------
HTTP_RESP := UTL_HTTP.GET_RESPONSE (HTTP_REQ);
BEGIN
LOOP
UTL_HTTP.READ_TEXT(HTTP_RESP, PIECE);
DATA_OUT := DATA_OUT || PIECE;
END LOOP;
EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN NULL;
END;
END POST;
Thanks in advance for any suggestions !!
Alessandro