Передача нескольких JSON для вызова REST API с использованием функции oracle APEX make_rest_request

Я пытаюсь вызвать 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. Но не уверен, что это правильный способ добиться этого или нет. Пожалуйста, предложите, есть ли другой лучший способ добиться этого.

Спасибо!

Вы хотите сделать несколько вызовов REST (по одному для каждого JSON) или вы хотите сделать один (!) вызов с каким-то агрегированным JSON?

Carsten 02.11.2022 12:27

@Carsten Да, один вызов для каждого json и сохранение ответа для каждого отдельно. если в ответ возвращается ошибка («статус»: «ОШИБКА»), то он не должен останавливать выполнение для другого json.

SKG 02.11.2022 12:50
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
171
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что ж, в конце вы должны пройтись по своему курсору, и для каждой итерации вы должны создать объект 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;
 /

Другие вопросы по теме