Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / передать в веб сервис два файла и получить назад один / 3 сообщений из 3, страница 1 из 1
15.05.2018, 07:14
    #39644737
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать в веб сервис два файла и получить назад один
нужен примерчик или полезная ссылка
есть такой полурабочий код, без блобов, передает параметры, получает датасет в виде XML
Код: 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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
/******************************************************************************
******************************************************************************/
PROCEDURE get_phd_data_params
    (p_list_tag_name    VARCHAR2,
     p_start_timestamp  TIMESTAMP,
     p_end_timestamp    TIMESTAMP,
     p_sample_interval  NUMBER,
     p_phd_tbl          IN OUT web_service_vars_pkg.phd_tbl_type,
     p_error_text       IN OUT VARCHAR2,
     p_data_as_str      NUMBER := NULL,
     -- 1 - записывать строки с пустыми Value и Value=0
     p_save_empty_value NUMBER := 1,
     p_debug            NUMBER := NULL
    )
IS
    v_service_URL   VARCHAR2(100);
    v_req           UTL_HTTP.req;
    v_resp          UTL_HTTP.resp;
    is_response     BOOLEAN;
    v_txt_resp      VARCHAR2(400);
    v_bad_auth      EXCEPTION;
    v_empty_xml     EXCEPTION;
    v_walletdir     VARCHAR2(100);

    v_xml           XMLTYPE := NULL;
    v_clob          CLOB := EMPTY_CLOB();
    v_xmlRequest    VARCHAR2(4000);
    V_status_code   VARCHAR2(4000);

   PROCEDURE end_resp
   IS
   BEGIN
      /* is_response, resp - глобальные переменные на уровне процедуры */
      IF is_response THEN
         UTL_HTTP.end_response(v_resp);
         is_response := FALSE;
      END IF;
   EXCEPTION
      WHEN others THEN
         bpls_put(SQLERRM || CHR(13) || 'строка: ' || dbms_utility.format_error_backtrace);
   END;

BEGIN

    bpls_put('start', TRUE);
    p_phd_tbl.DELETE;

    bpls_put('start SET_WALLET', TRUE);

    v_walletdir := MENU_CONST_PKG.READ_CONSTS('WALLET_DIR', SYSDATE);
    
    IF p_debug = 1 THEN
       bpls_put('WALLET_DIR' || v_walletdir);
    END IF;

    UTL_HTTP.SET_WALLET( v_walletdir, PASSWORD => NULL);

    v_service_URL := MENU_CONST_PKG.READ_CONSTS('PHD_SERVICE_URL', SYSDATE);
    IF p_debug = 1 THEN
       bpls_put('service_URL=' || v_service_URL);
    END IF;

    v_xmlRequest := 
'<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <PhdDataParams xmlns="PHDService">
      <s_tagname>' || p_list_tag_name || '</s_tagname>
      <s_start_timestamp>' || TO_CHAR(p_start_timestamp, 'rrrr-mm-dd hh24:mi:ss') || '</s_start_timestamp>
      <s_end_timestamp>'   || TO_CHAR(p_end_timestamp,   'rrrr-mm-dd hh24:mi:ss') || '</s_end_timestamp>
      <s_sample_interval>' || TO_CHAR(p_sample_interval)                          || '</s_sample_interval>
    </PhdDataParams>
  </soap12:Body>
</soap12:Envelope>';

    IF p_debug = 1 THEN
       bpls_put('xmlRequest :=');
       bpls_put(v_xmlRequest);
       bpls_put('------');
    END IF;

    bpls_put('start begin_request', TRUE);
    v_req := utl_http.begin_request(v_service_URL, 'POST','HTTP/1.1');
              
    utl_http.set_header(v_req, 'Content-Type', 'text/xml;  charset=utf-8');
    utl_http.set_header(v_req, 'Content-Length', LENGTH(v_xmlRequest));
    utl_http.set_header(v_req, 'SOAPAction', 'PHDService/PhdDataParams');
    utl_http.write_text(v_req, v_xmlRequest);

    bpls_put('start get_response', TRUE);
    v_resp := utl_http.get_response(v_req);
    V_status_code := v_resp.status_code;
    bpls_put('HTTP response: ' || v_resp.status_code || ' (' || v_resp.reason_phrase || ')', TRUE);

    is_response := TRUE;

    v_xml := get_xml(v_resp, v_clob,
                     CASE WHEN '='||V_status_code <> '=200' THEN 1
                          ELSE p_debug
                     END);

    bpls_put('start insert into tmp_phd', TRUE);

    phd_xml_to_tmp(v_xml, p_phd_tbl, p_data_as_str, p_save_empty_value, p_debug);

    end_resp; -- end_response
    
    IF p_phd_tbl.COUNT = 0 THEN
       -- временно проверим что там
       p_error_text := SUBSTR(v_clob, 1, 4000);
    END IF;
 
    bpls_put('end', TRUE);

    v_Clob := NULL;

END;



а как это будет выглядеть с файлами (блобами), пока не чувствую
...
Рейтинг: 0 / 0
15.05.2018, 11:06
    #39644816
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать в веб сервис два файла и получить назад один
andreymx,

write_raw

Делал когда-то для работы с webdav, допилишь под себя
Код: 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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
     procedure put_file(
                    p_project in varchar2,
                    p_filename in varchar2,
                    p_prefix in varchar2,
                    p_mime_type in varchar2 default 'application/octet',
                    p_data in blob)
     as
          l_http_req       utl_http.req;
          l_http_resp      utl_http.resp;

          l_data_raw  raw(32767);
          l_amount    binary_integer := 32767;
          l_pos       integer := 1;


          l_request_url varchar2(255) := g_base_url ||'/' ||p_project ||'/' ||p_prefix ||'/' ||p_filename;
          l_content_length number := dbms_lob.getlength(p_data);
     begin
          l_http_req := utl_http.begin_request(l_request_url,'PUT');

          utl_http.set_header(l_http_req,'Content-Type',p_mime_type);
          utl_http.set_header(l_http_req,'Content-length',l_content_length);         
          utl_http.set_header(l_http_req,'Transfer-encoding','chunked');       
          
          utl_http.set_authentication(l_http_req, g_username, g_password);               

          begin
            while l_pos <= l_content_length loop
  
                 dbms_lob.read(p_data,l_amount,l_pos,l_data_raw);
  
                 utl_http.write_raw(l_http_req,l_data_raw);
  
                 l_pos := l_pos + l_amount;
            end loop;
            
            exception 
             when others then
              utl_http.end_response(l_http_resp);
              raise;
          end;  

          l_http_resp := utl_http.get_response(l_http_req);

          if g_debug then
               print_response_data(l_http_resp, 'PUT FILE');
          end if;                     
          
          if l_http_resp.status_code <> 201 then
            utl_http.end_response(l_http_resp);
            raise_application_error(-20002,'HTTP response: status code - '||l_http_resp.status_code||'; reason - '||l_http_resp.reason_phrase);
          else          
           utl_http.end_response(l_http_resp);
          end if; 

     end put_file;
     
     procedure get_file(
                    p_project in varchar2,
                    p_filename in varchar2,
                    p_prefix in varchar2,
                    p_mime_type in varchar2 default 'application/octet',
                    p_data in out nocopy blob)
     as
          l_http_req       utl_http.req;
          l_http_resp      utl_http.resp;

          l_data_raw  raw(16383);
          l_amount    binary_integer := 16383;
          l_size      number := 0;

          l_header_name varchar2(30);
          l_header_value varchar2(50);
          
          l_request_url varchar2(255) := g_base_url ||'/' ||p_project ||'/' ||p_prefix ||'/' ||p_filename;
     begin
     
        l_http_req := utl_http.begin_request(l_request_url, 'GET');
        utl_http.set_header(l_http_req,'Content-Type',p_mime_type);                
          
        utl_http.set_authentication(l_http_req, g_username, g_password);               

        l_http_resp := utl_http.get_response(l_http_req);
        
          if g_debug then
               print_response_data(l_http_resp, 'GET FILE');
          end if;    

        for i in 1..utl_http.get_header_count(l_http_resp) loop
           begin 
             utl_http.get_header(l_http_resp, i, l_header_name, l_header_value);
             if l_header_name = 'Content-Length' then
              l_size := to_number(l_header_value,'999999999999999999999999999999999');
             end if;
             exception when others then
              dbms_output.put_line(sqlerrm);
           end;  
        end loop;
        
        if l_size <> 0 then 
            
            begin
              loop
                utl_http.read_raw(l_http_resp, l_data_raw, l_amount);
                if g_debug then
                  dbms_output.put_line(utl_raw.cast_to_varchar2(l_data_raw));
                end if;
                exit when l_data_raw is null; 
                dbms_lob.writeappend(p_data, utl_raw.length(l_data_raw), l_data_raw);
              end loop;
            end;
            
        end if;
        
--        p_data := l_blob;
        
        utl_http.end_response(l_http_resp);
        
      exception
        when utl_http.end_of_body then
          utl_http.end_response(l_http_resp);
     end get_file;
...
Рейтинг: 0 / 0
15.05.2018, 11:24
    #39644836
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать в веб сервис два файла и получить назад один
env,

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


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