Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 передать в веб сервис два файла и получить назад один  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
нужен примерчик или полезная ссылка
есть такой полурабочий код, без блобов, передает параметры, получает датасет в виде XML
/******************************************************************************
******************************************************************************/
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;


а как это будет выглядеть с файлами (блобами), пока не чувствую
15 май 18, 07:14    [21409662]     Ответить | Цитировать Сообщить модератору
 Re: передать в веб сервис два файла и получить назад один  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
andreymx,

write_raw

Делал когда-то для работы с webdav, допилишь под себя
     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;
15 май 18, 11:06    [21410111]     Ответить | Цитировать Сообщить модератору
 Re: передать в веб сервис два файла и получить назад один  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
env,

большое спасибо, уже начинал читать в эту сторону
15 май 18, 11:24    [21410169]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить