powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работа с API
14 сообщений из 14, страница 1 из 1
Работа с API
    #39307659
MaximShinkarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые форумчане,

Передо мной(макакой, не знающей SQL) поставили задачу:
1) Нужно отправить запрос на адрес onlyoffice.eu/api/2.0/authentication с параметрами username и password.
2) Получить в ответе от сервера token.
3) При INSERT'e в таблицу автоматически отправлять свеже-добавленные строки(lastname, firstname, email из таблицы USERS) на https://onlyoffice.eu/api/2.0/people, при этом добавив в Header token из предыдущего запроса.


Погуглив, я понял, что выполнить это можно с помощью UTL_HTTP, но разобраться с ним так и не смог. А третий пункт - это нужно создать триггер, который вызовет метод с отправкой файлов.

Можете помочь написать этот запрос?
...
Рейтинг: 0 / 0
Работа с API
    #39308053
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы начал не с кода, а с пониманием что надо отправить на сервер и как принять ответ.
бери плагин к браузеру который позволяет вызвать апи.
для firefox я пользую rested. есть какие-то и для хрома (ищи по словам rest api).

в оракле нормально парсится xml - соответственно лучше использовать такой ответ xml.
дальше, когда поймешь какие заголовки, какое тело, и по какому адресу отсылать - переходишь к использованию utl_http.

я пользовал пример httpPost отсюда:
http://daggett-beaver.blogspot.com/2010/03/test.html
...
Рейтинг: 0 / 0
Работа с API
    #39308166
MaximShinkarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry.,
При первом запросе с параметрами username и password получаю такой XML:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<result>
    <count>1</count>
    <status>0</status>
    <statusCode>201</statusCode>
    <response>
        <token>oAf5U23dQqn0cSQzNuOwN7CLW7R+fik4xV5Te7/YZ9IERMivUwUiQA9abO2U+maXGgygOwIZtLoLWFN04q1k4AV0+vGOsJiQadjt+4iOq0vs5mNImH425DsknhPsN9qA1N</token>
        <expires>2017-09-13T09:47:55.0166204+03:00</expires>
        <sms>false</sms>
        <phoneNoise />
    </response>
</result>



Далее я начал разбирать пример кода на сайте, который Вы дали, но не смог понять его полностью.
Насколько я понял, в этой части кода ничего менять не требуется:
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
CREATE OR REPLACE PACKAGE WS_TOOLS
    IS
    FUNCTION callWS(p_url IN VARCHAR2,p_method IN XMLTYPE,p_user in VARCHAR2 :=null,p_pass in VARCHAR2 :=null) RETURN XMLTYPE;
END;
/
CREATE OR REPLACE PACKAGE BODY WS_TOOLS
IS


--internal function to post http(s) request
FUNCTION httpPost
(
    p_url     IN VARCHAR2,
    p_data    IN CLOB,
    p_timeout IN BINARY_INTEGER DEFAULT 60
) 
    RETURN CLOB
IS
    --
    v_request  utl_http.req;
    v_response utl_http.resp;
    v_buffer   CLOB;
    v_chunk    VARCHAR2(4000);
    v_length   NUMBER;
    v_index    NUMBER;
BEGIN

    v_index := 1;
    v_length := nvl(length(p_data), 0);

    -- configure HTTP
    utl_http.set_response_error_check(enable => FALSE);
    utl_http.set_detailed_excp_support(enable => FALSE);
    utl_http.set_transfer_timeout(p_timeout);

    -- send request
    v_request := utl_http.begin_request(p_url, 'POST','HTTP/1.1');
    utl_http.set_header(v_request, 'Content-Type', 'text/xml');
    --utl_http.set_header(v_request, 'Content-Length', v_length);
    WHILE v_index <= v_length LOOP
        utl_http.write_text(v_request, substr(p_data, v_index, 4000));
        v_index := v_index + 4000;
    END LOOP;

    -- check HTTP status code for error
    IF v_response.status_code <> utl_http.http_ok THEN   
        raise_application_error(-20400,v_response.status_code || ' - ' || v_response.reason_phrase);
    END IF;

    -- get response
    dbms_lob.createtemporary(v_buffer, FALSE);
    v_response := utl_http.get_response(v_request);
    BEGIN
        LOOP
            utl_http.read_text(v_response, v_chunk, 4000);
            dbms_lob.writeappend(v_buffer, length(v_chunk), v_chunk);
        END LOOP;
    EXCEPTION
        WHEN utl_http.end_of_body THEN NULL;
    END;
    utl_http.end_response(v_response);

    RETURN v_buffer;

END;


FUNCTION callWS
(
    p_url IN VARCHAR2,
    p_method IN XMLTYPE,
    p_user in VARCHAR2 :=null,
    p_pass in VARCHAR2 :=null

    --p_timeout IN NUMBER := 60
)
    RETURN XMLTYPE
IS



Проблемы начинаются с этого куска кода:

Код: 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.
36.
v_envelope XMLTYPE;
    v_header XMLTYPE;
    v_response CLOB;
    v_fault XMLTYPE;
    v_sqlerrm VARCHAR2(2000);
BEGIN
    if p_user is not null then
        --prepare header
        SELECT
XMLElement(
                "soap:Header",
                XMLElement(
                    "wsse:Security",
                    XMLAttributes(
                        'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' AS "xmlns:wsse"
                    ),
                    XMLElement(
                        "wsse:UsernameToken",
                        XMLAttributes(
                            'UsernameToken-1' AS "wsu:Id",
                            'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' AS "xmlns:wsu"
                        ),
                        XMLElement(
                            "wsse:Username",
                            'cfront'
                        ),
                        XMLElement(
                            "wsse:Password",
                            XMLAttributes(
                                'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText' AS "Type"
                            ),
                            'cfrontpass'
                        )
                    )
                )
            )



Не могу понять что писать после wsse , а также что это за ссылка " http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" ссылка?


Также и в последней части, вроде менять ничего и не нужно, правильно?

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
 SELECT
        XMLElement(
            "soap:Envelope",
            XMLAttributes(
                'http://schemas.xmlsoap.org/soap/envelope/' AS "xmlns:soap"
            ),
            v_header,
            
            XMLElement(
                "soap:Body",
                p_method
            )
        )
    INTO
        v_envelope
    FROM
        dual;

    -- POST request
    v_response := httpPost(
        p_url,
        v_envelope.getClobVal(),
        60 -- 60 seconds
    );
    IF v_response IS NULL THEN
        raise_application_error(-20400,'empty response');
    END IF;

    -- parse response
    BEGIN
        v_envelope := XMLType(v_response);
    EXCEPTION
        WHEN OTHERS THEN
            raise_application_error(-20400,'can''t parse xml: '||SQLERRM);
    END;

    -- check for a fault
    v_fault := v_envelope.extract(  
        '/soap:Envelope/soap:Body/soap:Fault', 
        'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"'
    );
    IF v_fault IS NOT NULL THEN
        v_sqlerrm := v_fault.extract('.//faultstring/text()').getStringVal();
        raise_application_error(-20400,'remote error: '||v_sqlerrm);
    END IF;

    -- the actual response is the child of the "soap:Body" element
    RETURN v_envelope.extract(
        '/soap:Envelope/soap:Body/*[position() = 1]', 
        'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"'
    );
END;

END;
...
Рейтинг: 0 / 0
Работа с API
    #39308175
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximShinkarevПри первом запросе
MaximShinkarevДалее я начал разбирать пример кода на сайте
поменяйте свои действия местами. т.к этот код отправляет SOAP запрос на WS
...
Рейтинг: 0 / 0
Работа с API
    #39308181
MaximShinkarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,

Извиняюсь, я неправильно выразился.
Моя фраза "при первом запросе" - это то, что я получил с помощью программы Postman, а не с помощью запроса из SQL. Получил просто для примера XML'a, который я получу.
...
Рейтинг: 0 / 0
Работа с API
    #39308190
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximShinkarev,

ну так посмотрите, что оправляте с помощью Postman и сделайте тоже самое через
авторпример кода на сайте, если хотите его использовать
...
Рейтинг: 0 / 0
Работа с API
    #39308321
MaximShinkarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все-таки нашёл более простой вариант кода, но не могу понять как отправить в Body 2 переменные:

Вот код:
Код: 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.
create or replace procedure publish_cinema_event
( p_username in varchar2
, p_password in varchar2
)is
  req utl_http.req;
  res utl_http.resp;
  --url varchar2(4000) := 'http://alsytto.onlyoffice.eu/api/2.0/authentication.xml?userName=roma@alsy.by&;password=cjdCtrhtnyj';
  url varchar2(4000) := 'date.jsontest.com';
  name varchar2(4000);
  buffer varchar2(4000); 
  content varchar2(4000) := '{}';
 
begin
  req := utl_http.begin_request(url, 'POST',' HTTP/1.1');
 -- utl_http.set_header(req, 'user-agent', 'mozilla/4.0'); 
  utl_http.set_header(req, 'content-type', 'application/json'); 
  utl_http.set_header(req, 'Content-Length', length(content));
 
  utl_http.write_text(req, content);
  res := utl_http.get_response(req);
  -- process the response from the HTTP call
  begin
    loop
      utl_http.read_line(res, buffer);
      dbms_output.put_line(buffer);
    end loop;
    utl_http.end_response(res);
  exception
    when utl_http.end_of_body 
    then
      utl_http.end_response(res);
  end;
end publish_cinema_event;



Проблема в том, что
Код: plsql
1.
content varchar2(4000) := '{}';

должен содержать username со значением "max@max.ru" и password "maximmaxim".

Так вот, как добавить в content эти две переменные?
...
Рейтинг: 0 / 0
Работа с API
    #39308884
MaximShinkarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все-таки получилось принять от сервера токен. Проблема теперь состоит в том, что его нужно распарсить.

С помощью этого кода
Код: 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.
create or replace procedure publish_cinema_even
is
  req utl_http.req;
  res utl_http.resp;
  url varchar2(4000) := 'https://alsytto.onlyoffice.eu/api/2.0/authentication.xml?userName=roma@roma.by&;password=password';
  name varchar2(4000);
  buffer varchar2(4000); 
  content varchar2(4000) := '{}';
 
begin
  utl_http.set_wallet ('file:c:\app\wallet2','test1234');
  utl_http.set_detailed_excp_support (true);
  req := utl_http.begin_request(url, 'POST',' HTTP/1.1');
  
  --UTL_HTTP.set_wallet('file:/c:\app\oraUser\product\12.1.0\dbhome_1\BIN\wallets', 'test1234');
  --utl_http.set_header(req, 'user-agent', 'mozilla/4.0'); 
  --utl_http.set_header(req, 'content-type', 'application/json'); 
  utl_http.set_header(req, 'Content-Length', length(content));
 
  utl_http.write_text(req, content);
  res := utl_http.get_response(req);
  -- process the response from the HTTP call
  begin 
    loop
      utl_http.read_line(res, buffer);
      dbms_output.put_line(buffer);
    end loop;
    utl_http.end_response(res);
  exception
    when utl_http.end_of_body 
    then
      utl_http.end_response(res);
  end;
end publish_cinema_even;


я получаю такой ответ:
Код: xml
1.
<result><count>1</count><status>0</status><statusCode>201</statusCode><response><token>oAf5U23dQqn0cSQzNuOwN7CLW7R+fiv4xV5Te7/YZ9IERMivUwUiQA9abO2U+maXGgygOwIZtLoLWFN04q1k4AV0+vGOsJiQadjt+4iOq0vs5mNImH5DsknhPsN9qA1N</token><expires>2017-09-14T10:53:56.2760087+03:00</expires><sms>false</sms><phoneNoise /></response></result>



Как можно вырвать из этой XML-ки token?
...
Рейтинг: 0 / 0
Работа с API
    #39308905
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просьба сильно не пинать, это моя первая попытка после прочтения ликбеза .

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as
 (select xmltype('<result><count>1</count><status>0</status><statusCode>201</statusCode><response><token>oAf5U23dQqn0cSQzNuOwN7CLW7R+fiv4xV5Te7/YZ9IERMivUwUiQA9abO2U+maXGgygOwIZtLoLWFN04q1k4AV0+vGOsJiQadjt+4iOq0vs5mNImH5DsknhPsN9qA1N</token><expires>2017-09-14T10:53:56.2760087+03:00</expires><sms>false</sms><phoneNoise /></response></result>') xml
    from dual)
select x.*
  from t,
       XMLTABLE('//token' PASSING t.xml COLUMNS xml VARCHAR2(400) path
                '/token') x
...
Рейтинг: 0 / 0
Работа с API
    #39308926
MaximShinkarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

Насколько я понял, это берет из таблицы.

А у меня прямо в скрипте есть переменная buffer, в которую я записываю XML с сервера.
И что-то не могу понять, как изменить Ваш код, чтобы он работал именно с моей переменной.

P.S. код скрипта, если что, есть чуть выше.
...
Рейтинг: 0 / 0
Работа с API
    #39309054
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все что есть в таблице, можно записать в переменную.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare
  x xmltype := xmltype('<result><count>1</count><status>0</status><statusCode>201</statusCode><response><token>oAf5U23dQqn0cSQzNuOwN7CLW7R+fiv4xV5Te7/YZ9IERMivUwUiQA9abO2U+maXGgygOwIZtLoLWFN04q1k4AV0+vGOsJiQadjt+4iOq0vs5mNImH5DsknhPsN9qA1N</token><token>Толкин</token><expires>2017-09-14T10:53:56.2760087+03:00</expires><sms>false</sms><phoneNoise /></response></result>');
begin
  for c in (
select x.xml
  from XMLTABLE('//token' PASSING x COLUMNS xml VARCHAR2(400) path
                '/token') x
       ) loop
  dbms_output.put_line('token: ' || c.xml);
  end loop;
end;
...
Рейтинг: 0 / 0
Работа с API
    #39309119
MaximShinkarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

Спасибо.
Осталась осталось только одна вещь.
Мне нужно в переменную занести значение SELECT'a:

Код: plsql
1.
2.
(SELECT * FROM (
   SELECT PERSON_EMAIL FROM PERSONS  WHERE rownum BETWEEN 1 AND ID ORDER BY rownum DESC)  WHERE  rownum=1);



Пробую
Код: plsql
1.
2.
EMAIL := (SELECT * FROM (
   SELECT PERSON_EMAIL FROM PERSONS  WHERE rownum BETWEEN 1 AND ID ORDER BY rownum DESC)  WHERE  rownum=1);



или так:

Код: plsql
1.
2.
SET EMAIL = SELECT * FROM (
   SELECT PERSON_EMAIL FROM PERSONS  WHERE rownum BETWEEN 1 AND ID ORDER BY rownum DESC)  WHERE  rownum=1;



При этом предварительно объявив email в DECLARE:

Код: plsql
1.
email varchar2(4000);



Но в любом случае не даёт выполнить команду. Как правильно занести в переменную?
...
Рейтинг: 0 / 0
Работа с API
    #39309145
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximShinkarev..

Но в любом случае не даёт выполнить команду. Как правильно занести в переменную?
правильно допрежде занести , книжки почитать
Код: plsql
1.
2.
3.
4.
5.
declare
  a varchar2(30);
begin
  select dummy into a from dual;
end;
...
Рейтинг: 0 / 0
Работа с API
    #39309147
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximShinkarev,

1) Вам показали как занести результат запроса в переменную
2) Предлагаю научиться пользоваться поиском как по форуму, так и в гугле
3) Что будет если результат будет больше 4000 byte/char? Лучше использовать CLOB+DBMS_LOB
4) 19434248
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работа с API
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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