Я пытаюсь вызвать REST API, используя предоставленную Oracle APEX функцию apex_web_service.make_rest_request, передав JSON.
JSON создается с помощью приведенной ниже утилиты путем передачи файла sys_refcursor.
apex_json.open_object;
apex_json.write(l_sys_refcursor);
apex_json.close_object;
lclob_body := apex_json.get_clob_output;
Теперь я передаю значение lclob_body ниже
begin
apex_web_service.set_request_headers(
p_name_01 => 'Content-Type',
p_value_01 => 'application/json',
p_name_02 => 'User-Agent',
p_value_02 => 'APEX',
p_name_03 => 'Authorization',
p_value_03 => 'Basic xxxasdasdasdsaddsadsdsasfsafa',
p_reset => true,
p_skip_if_exists => true );
end;
v_response := apex_web_service.make_rest_request
(
p_url => 'https://....api_url',
p_http_method => 'POST',
p_body => lclob_body
);
Это отлично работает для одного JSON, но когда sys_refcursor возвращает несколько строк, создается несколько json. В этом случае на вызов API передается только первый json.
Как передать каждый json (для каждой строки, возвращаемой sys_refcursor) один за другим в функцию make_rest_request для вызова API?
Редактировать: 1
Я сделал это, просто перебирая sys_refcursor в переменные.
loop
fetch l_cursor into p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15;
exit when l_cursor%notfound;
apex_json.open_object;
apex_json.write('field1',p1);
apex_json.write('field2',p2);
apex_json.write('field3',p3);
apex_json.write('field4',p4);
apex_json.write('field5',p5);
apex_json.write('field6',p6);
apex_json.write('field7',p7);
apex_json.write('field8',p8);
apex_json.write('field9',p9);
apex_json.write('field10',p10);
apex_json.write('field11',p11);
apex_json.write('field12',p12);
apex_json.write('field13',p13);
apex_json.write('field14',p14);
apex_json.write('field15',p15);
apex_json.close_object;
lclob_body := apex_json.get_clob_output;
begin
apex_web_service.set_request_headers(
p_name_01 => 'Content-Type',
p_value_01 => 'application/json',
p_name_02 => 'User-Agent',
p_value_02 => 'APEX',
p_name_03 => 'Authorization',
p_value_03 => 'Basic xxxasdasdasdsaddsadsdsasfsafa',
p_reset => true,
p_skip_if_exists => true );
end;
v_response := apex_web_service.make_rest_request
(
p_url => 'https://....api_url',
p_http_method => 'POST',
p_body => lclob_body
);
dbms_output.put_line(v_response);
exception when others then
null;
end;
apex_json.free_output;
end loop;
При таком подходе можно вызывать API для каждого json. Но не уверен, что это правильный способ добиться этого или нет. Пожалуйста, предложите, есть ли другой лучший способ добиться этого.
Спасибо!
@Carsten Да, один вызов для каждого json и сохранение ответа для каждого отдельно. если в ответ возвращается ошибка («статус»: «ОШИБКА»), то он не должен останавливать выполнение для другого json.
Что ж, в конце вы должны пройтись по своему курсору, и для каждой итерации вы должны создать объект JSON, вызвать APEX_WEB_SERVICE и сохранить результат.
Процедура APEX_JSON.WRITE, которая принимает курсор, вам не подходит, поскольку она (вы уже это заметили) создает один JSON-объект со всеми данными. Но это не то, что вам нужно.
Я думаю, что второй подход с использованием собственных функций SQL/JSON является лучшим решением, поскольку он лучше всего соответствует вашим требованиям. Кроме того, собственные функции обычно быстрее, чем реализации PL/SQL, такие как APEX_JSON.
Сделано то же самое с собственными функциями JSON, как показано ниже.
set serveroutput on;
declare
v_response clob;
cursor c1 is
SELECT
json_object('field1' value 'AABBCC',
'field2' value t2.col1 ,
'field3' value t1.col1,
'field4' value 'Corp' ,
'field5' value 'AABB'||t2.col2 ,
'field6' value JSON_object (
'nested_field1' value '2029-11-13',
'nested_field2' value 'XYZ' ,
'nested_field3' value 'ABC' ,
'nested_field4' value '2019-11-12',
'nested_field5' value '1234' ,
'nested_field6' value 'ABC'
) ,
'field7' value '' ,
'field8' value 'TEAM' ,
'field9' value 'true' ,
'field10' value '12345' ,
'field11' value 'Scale' ,
'field12' value t2.col3 ,
'field13' value t1.col2 ,
'field14' value 'RUP' ,
'field15' value 'ZZ'
) a
FROM
tab1 t1,
tab2 t2
WHERE
t1.col1 = t2.col2
AND t1.col5 IS NULL;
begin
apex_web_service.set_request_headers(
p_name_01 => 'Content-Type',
p_value_01 => 'application/json',
p_name_02 => 'User-Agent',
p_value_02 => 'APEX',
p_name_03 => 'Authorization',
p_value_03 => 'Basic xxxasdasdasdsaddsadsdsasfsafa',
p_reset => true,
p_skip_if_exists => true );
for i in c1 loop
begin
v_response := apex_web_service.make_rest_request
(
p_url => 'https://....api_url',
p_http_method => 'POST',
p_body => i.a
);
exception when others then
null;
end;
end loop;
end;
/
Вы хотите сделать несколько вызовов REST (по одному для каждого JSON) или вы хотите сделать один (!) вызов с каким-то агрегированным JSON?