vkovalev,
Может, конечно, пароли и не стоило сюда копировать, но все же спасибо)))
1. Иногда необходимо (как правило, если на хосте крутится несколько виртуальных сайтов) указывать имя:
utl_http.set_header(req, 'Host', 'www.yourhostname.ru');
2. При определении
Content-Length могут быть проблемы, т.к.
length считает количество символов, но не байт. Более того данные, в зависимости от настроек, могут предаваться совсем не в той кодировке, в которой тебе хотелось бы. Поэтому текст надо кодировать в двоичный blob с требуемой кодировкой и передавать его (от него же и считать размер). Пример перевода из текстового clob в blob:
declare
v_clob clob := null;
v_blob blob := null;
...
dbms_lob.createtemporary(v_blob, true, dbms_lob.session);
dbms_lob.convertToBlob(dest_lob => v_blob
,src_clob => v_clob
,amount => dbms_lob.lobmaxsize
,dest_offset => 1
,src_offset => 1
,blob_csid => NLS_CHARSET_ID ('UTF8')
,lang_context => dbms_lob.default_lang_ctx
,warning => dbms_lob.no_warning
);
...
utl_http.set_header(req, 'Content-Length', dbms_lob.getlength(v_blob));
Если размер передаваемых данных большой, то передавать их надо в цикле небольшими пачками, иначе может возникнуть ошибка:
declare
l_buf_size constant integer := 32767;
l_text varchar2(32767);
begin
for i in 0..floor(length(l_request_blob)/l_buf_size) loop
UTL_HTTP.write_raw(req, dbms_lob.substr(lob_loc => v_blob, amount => l_buf_size, offset => l_buf_size*i+1));
end loop;
end;
Может быть и не все здесь касается твоего случая, но привожу на всякий случай.
И еще раз проверь, соответствует ли url вводимый в explorer и передаваемый функции, включая и номер порта.