Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Веб-запрос выполняется со второго раза (UTL_HTTP) / 12 сообщений из 12, страница 1 из 1
30.11.2018, 07:45
    #39740649
Херург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Веб-запрос выполняется со второго раза (UTL_HTTP)
Добрый день, уважаемые.
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
30.11.2018, 08:27
    #39740655
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Веб-запрос выполняется со второго раза (UTL_HTTP)
ХерургПодскажите в какую сторону копать.А ты почитай reason_phrase и L_BLOB.
...
Рейтинг: 0 / 0
30.11.2018, 08:44
    #39740664
Херург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Веб-запрос выполняется со второго раза (UTL_HTTP)
Elic,
Blob пустой, reason_phrase: Internal Server Error

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

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

Попроси логи на принимающей стороне. Возможно, у тебя есть прослойка между отправителем и приёмником, которая корёжит первый вызов.
...
Рейтинг: 0 / 0
30.11.2018, 11:36
    #39740762
Херург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Веб-запрос выполняется со второго раза (UTL_HTTP)
Пока нет возможности получить логи с той стороны. Возможно причина в том как я инициализирую 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
30.11.2018, 11:39
    #39740765
Херург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Веб-запрос выполняется со второго раза (UTL_HTTP)
p.s. особенность такая что именно в первый раз после инициализации сессии запрос падает, потом все ОК
...
Рейтинг: 0 / 0
30.11.2018, 13:04
    #39740805
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Веб-запрос выполняется со второго раза (UTL_HTTP)
ХерургВозможно причина в том как я инициализирую CLOB?Нет.
...
Рейтинг: 0 / 0
30.11.2018, 13:07
    #39740807
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Веб-запрос выполняется со второго раза (UTL_HTTP)
Херург
Код: plsql
1.
UTL_HTTP.SET_PERSISTENT_CONN_SUPPORT(L_HTTP_REQUEST,true);

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

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

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


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