Skip to Main Content

APEX

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Post binary file and parameters to Web Services via Oracle APEX 4.2 and PL/SQL - HTTP 400 Bad Request Error

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

Comments
Post Details
Added on Sep 11 2023
5 comments
75 views