Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Херург
Member

Откуда: AL, KZ
Сообщений: 18
Добрый день, уважаемые.
Oracle обращается к внешним сервисам с помощью веб-запросов типа POST. Использую для этого UTL_HTTP. Проблема в том что запросы срабатывают только со второго раза. В первый раз (после открытия сессии) один сервис возвращает 400 ошибку, другой 500. А со второго и дальше все улетает. Отправляю CLOB (L_BODY_REQ), передаю и получаю блоками чтобы не превысить размер 32к. Если делать запросы из того же Postman'a все летает хорошо. Подскажите в какую сторону копать.
Кусок кода:
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;
30 ноя 18, 07:45    [21749335]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28467
Херург
Подскажите в какую сторону копать.
А ты почитай reason_phrase и L_BLOB.
30 ноя 18, 08:27    [21749355]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Херург
Member

Откуда: AL, KZ
Сообщений: 18
Elic,
Blob пустой, reason_phrase: Internal Server Error

Я сначала грешил на внешние сервисы, но ведь через сторонние инструменты отправки запросов все уходит сразу
30 ноя 18, 08:44    [21749374]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5907
Херург,

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

Попроси логи на принимающей стороне. Возможно, у тебя есть прослойка между отправителем и приёмником, которая корёжит первый вызов.
30 ноя 18, 09:37    [21749423]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Херург
Member

Откуда: AL, KZ
Сообщений: 18
Пока нет возможности получить логи с той стороны. Возможно причина в том как я инициализирую CLOB?
Сейчас примерно так:
declare 
L_BODY_REQ	clob;
begin
  select BODY into L_BODY_REQ from TABLE where ID=1256152;
end;
30 ноя 18, 11:36    [21749704]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Херург
Member

Откуда: AL, KZ
Сообщений: 18
p.s. особенность такая что именно в первый раз после инициализации сессии запрос падает, потом все ОК
30 ноя 18, 11:39    [21749709]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28467
Херург
Возможно причина в том как я инициализирую CLOB?
Нет.
30 ноя 18, 13:04    [21749852]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28467
Херург
UTL_HTTP.SET_PERSISTENT_CONN_SUPPORT(L_HTTP_REQUEST,true);
Зачем тебе это?
30 ноя 18, 13:07    [21749857]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Херург
Member

Откуда: AL, KZ
Сообщений: 18
Elic,

Пробовал, экспериментировал. Наличие этой строки не влияет на результат
30 ноя 18, 21:06    [21750779]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5907
Херург
Если делать запросы из того же Postman'a

с того же сервера, с теми же http-заголовками, с тем же телом сообщения, с такими же chunk... ?
3 дек 18, 11:41    [21751855]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
SkilledJunior
Member

Откуда:
Сообщений: 293
Херург
Пока нет возможности получить логи с той стороны. Возможно причина в том как я инициализирую CLOB?

Попробуй так:
L_BODY_REQ	clob := empty_clob();
3 дек 18, 23:39    [21752471]     Ответить | Цитировать Сообщить модератору
 Re: Веб-запрос выполняется со второго раза (UTL_HTTP)  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28467
SkilledJunior
Попробуй так:
L_BODY_REQ	clob := empty_clob();
Чем бы дитя не тешилось...
4 дек 18, 00:00    [21752481]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить