powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Веб-запрос выполняется со второго раза (UTL_HTTP)
12 сообщений из 12, страница 1 из 1
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740649
Херург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, уважаемые.
Oracle обращается к внешним сервисам с помощью веб-запросов типа POST. Использую для этого UTL_HTTP. Проблема в том что запросы срабатывают только со второго раза. В первый раз (после открытия сессии) один сервис возвращает 400 ошибку, другой 500. А со второго и дальше все улетает. Отправляю CLOB (L_BODY_REQ), передаю и получаю блоками чтобы не превысить размер 32к. Если делать запросы из того же Postman'a все летает хорошо. Подскажите в какую сторону копать.
Кусок кода:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
L_HTTP_REQUEST := UTL_HTTP.BEGIN_REQUEST(L_URL,'POST',UTL_HTTP.HTTP_VERSION_1_1);
UTL_HTTP.SET_PERSISTENT_CONN_SUPPORT(L_HTTP_REQUEST,true);
UTL_HTTP.SET_TRANSFER_TIMEOUT(L_HTTP_REQUEST,L_TIMEOUT);
UTL_HTTP.SET_BODY_CHARSET(L_CODEPAGE);
UTL_HTTP.SET_HEADER(L_HTTP_REQUEST,'Content-Type','application/xml; charset='||L_CODEPAGE);
UTL_HTTP.SET_HEADER(L_HTTP_REQUEST,'Accept','application/xml; charset='||L_CODEPAGE);
UTL_HTTP.SET_HEADER(L_HTTP_REQUEST,'Transfer-Encoding','chunked');
UTL_HTTP.SET_HEADER(L_HTTP_REQUEST,'Content-Length',LEN_BYTE);

OFFSET := 1;
while (OFFSET < LEN_SYM) loop
  DBMS_LOB.READ(L_BODY_REQ,plp$AMOUNT,OFFSET,BUFFER);
  UTL_HTTP.WRITE_TEXT(L_HTTP_REQUEST,BUFFER);
  OFFSET := OFFSET+plp$AMOUNT;
end loop;

L_HTTP_RESPONSE := UTL_HTTP.GET_RESPONSE(L_HTTP_REQUEST);

begin
  loop
    UTL_HTTP.READ_RAW(L_HTTP_RESPONSE,L_BUFFER,plp$AMOUNT);
    DBMS_LOB.WRITEAPPEND(L_BLOB,UTL_RAW.LENGTH(L_BUFFER),L_BUFFER);
  end loop;
exception
  when UTL_HTTP.END_OF_BODY then
    UTL_HTTP.END_RESPONSE(L_HTTP_RESPONSE);
   when others then
    if sqlcode in (-4061,-6508) then raise; end if;
    UTL_HTTP.END_RESPONSE(L_HTTP_RESPONSE);
     L_ERR := SUBSTR(UTL_HTTP.GET_DETAILED_SQLERRM,1,plp$AMOUNT);
end;

if L_HTTP_RESPONSE.STATUS_CODE <> UTL_HTTP.HTTP_OK then  					
  L_ERR := L_ERR||'Запрос завершился с ошибкой. Код ошибки: '||L_HTTP_RESPONSE.STATUS_CODE;
end if;
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740655
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХерургПодскажите в какую сторону копать.А ты почитай reason_phrase и L_BLOB.
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740664
Херург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,
Blob пустой, reason_phrase: Internal Server Error

Я сначала грешил на внешние сервисы, но ведь через сторонние инструменты отправки запросов все уходит сразу
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740677
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Херург,

500 это код ответа веб-сервера. Если ты получил ответ с таким кодом, значит запрос до него дошёл.

Попроси логи на принимающей стороне. Возможно, у тебя есть прослойка между отправителем и приёмником, которая корёжит первый вызов.
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740762
Херург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока нет возможности получить логи с той стороны. Возможно причина в том как я инициализирую CLOB?
Сейчас примерно так:
Код: plsql
1.
2.
3.
4.
5.
declare 
L_BODY_REQ	clob;
begin
  select BODY into L_BODY_REQ from TABLE where ID=1256152;
end;
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740765
Херург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.s. особенность такая что именно в первый раз после инициализации сессии запрос падает, потом все ОК
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740805
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХерургВозможно причина в том как я инициализирую CLOB?Нет.
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39740807
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Херург
Код: plsql
1.
UTL_HTTP.SET_PERSISTENT_CONN_SUPPORT(L_HTTP_REQUEST,true);

Зачем тебе это?
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39741308
Херург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Пробовал, экспериментировал. Наличие этой строки не влияет на результат
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39741881
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХерургЕсли делать запросы из того же Postman'a
с того же сервера, с теми же http-заголовками, с тем же телом сообщения, с такими же chunk... ?
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39742178
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ХерургПока нет возможности получить логи с той стороны. Возможно причина в том как я инициализирую CLOB?
Попробуй так:
Код: plsql
1.
L_BODY_REQ	clob := empty_clob();
...
Рейтинг: 0 / 0
Веб-запрос выполняется со второго раза (UTL_HTTP)
    #39742183
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorПопробуй так:
Код: plsql
1.
L_BODY_REQ	clob := empty_clob();

Чем бы дитя не тешилось...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Веб-запрос выполняется со второго раза (UTL_HTTP)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]