从plsql调用soap基础服务

时间:2019-04-07 13:05:58

标签: soap plsql oracle11g

我正在从plsql调用soap基础https服务,但没有得到响应,请参见下面的代码来调用soap。

PROCEDURE SALES_XML_CUSTOMS_PRC
   IS
CURSOR GET_HEADER IS
   SELECT COUNT(OSDD.SALE_REF_NO) ITEM_COUNT, SUM(OSDD.DD_QTY) SUM_QTY, OSD.SALE_REF_NO ,'8326' RETAILSTOREID, TO_CHAR(OSD.DOC_DATE,'DD') GUN, TO_CHAR(OSD.DOC_DATE,'MM') AY, TO_CHAR(OSD.DOC_DATE,'YYYY') YIL,
                   TO_CHAR(OSD.DOC_DATE,'HH') SAAT, TO_CHAR(OSD.DOC_DATE,'MI') DAKIKA, TO_CHAR(OSD.DOC_DATE,'SS') SANIYE, 
          DECODE(DT_CODE,'IN', 'Z000', 'CR', 'Z005') TRANSTYPECODE, OSD.CREATION_TERM WORKSTATIONID, OSD.DOC_PROV_NO TRANSNUMBER,
          TO_CHAR(OSD.DOC_DATE,'YYYYMMDDHHMMSS') BEGINTIMESTAMP, TO_CHAR(OSD.DOC_DATE,'YYYYMMDDHHMMSS') ENDTIMESTAMP, OSD.SM_CODE OPERATORID, 
          'EUR' TRANSCURRENCY, 1 TENDERNUMBER, 'ZEUR' TENDERTYPECODE,
          OSD.DOC_TOTAL_AMOUNT TENDER_AMOUNT, 'EUR' TENDERCURRENCY, 
          OSEI.NAT_CODE, OSEI.PASSENGER_TYPE, OSEI.GENDER, OSEI.HAS_INFANT, OSEI.HAS_CHILD, OSEI.AIRLINE_CODE, OSEI.DEPARTURE_CODE, OSEI.ARRIVAL_CODE, 
          OSEI.FLIGHT_NO, OSEI.CASH_NAT_ID, OSEI.DOC_TYPE, OSEI.PASSPORT_NO, OSEI.PAS_SURNAME||OSEI.PAS_NAME PASS_SUR_NAME, OSEI.PAS_DOB,
          OSD.DOC_PROV_NO
    FROM OFF_SALE_DOCUMENTS@MOSIAT OSD, OFF_SALE_DOCUMENT_DETAILS@MOSIAT OSDD, OFF_SALE_EXTRA_INFO@MOSIAT OSEI, OFF_SENT_SALES@MOSIAT LOG
    WHERE  1=1   
    AND OSD.DOC_PROV_NO = OSDD.DOC_PROV_NO
    AND OSD.DEP_CODE = OSDD.DEP_CODE
    AND OSD.SALE_REF_NO = OSDD.SALE_REF_NO
    AND OSEI.SALE_REf_NO(+) = OSD.SALE_REF_NO
    AND OSEI.DOC_PROV_NO(+) = OSD.DOC_PROV_NO
    AND OSEI.DEP_CODE(+) = OSD.DEP_CODE
    AND OSD.DOC_STATUS = 1
    AND OSD.SALE_REF_NO = LOG.SALE_REF_NO
    AND OSD.DOC_PROV_NO = LOG.DOC_PROV_NO
    AND OSD.DEP_CODE = LOG.DEP_CODE
    AND LOG.SENT_FLAG = 0
    AND ROWNUM = 1
    GROUP BY OSD.SALE_REF_NO ,'8326' , TO_CHAR(OSD.DOC_DATE,'DD') , TO_CHAR(OSD.DOC_DATE,'MM') , TO_CHAR(OSD.DOC_DATE,'YYYY') ,
             TO_CHAR(OSD.DOC_DATE,'HH') , TO_CHAR(OSD.DOC_DATE,'MI') , TO_CHAR(OSD.DOC_DATE,'SS') , 
             DECODE(DT_CODE,'IN', 'Z000', 'CR', 'Z005') , OSD.CREATION_TERM , OSD.DOC_PROV_NO ,
             TO_CHAR(OSD.DOC_DATE,'YYYYMMDDHHMMSS') , TO_CHAR(OSD.DOC_DATE,'YYYYMMDDHHMMSS') , OSD.SM_CODE , 'EUR' , 1 , 'ZEUR' ,
             OSD.DOC_TOTAL_AMOUNT , 'EUR' , OSEI.NAT_CODE, OSEI.PASSENGER_TYPE, OSEI.GENDER, OSEI.HAS_INFANT, OSEI.HAS_CHILD, 
             OSEI.AIRLINE_CODE, OSEI.DEPARTURE_CODE, OSEI.ARRIVAL_CODE, OSEI.FLIGHT_NO, OSEI.CASH_NAT_ID, OSEI.DOC_TYPE, OSEI.PASSPORT_NO, 
             OSEI.PAS_SURNAME||OSEI.PAS_NAME , OSEI.PAS_DOB, OSD.DOC_PROV_NO
    ORDER BY OSD.SALE_REF_NO;

  l_output        UTL_FILE.file_type;
  l_thecursor     INTEGER            DEFAULT DBMS_SQL.open_cursor;
  l_columnvalue   VARCHAR2 (2000);
  l_status        INTEGER;
  l_colcnt        NUMBER             DEFAULT 0;
  l_separator     VARCHAR2 (10)      DEFAULT '';
  l_cnt           NUMBER             DEFAULT 0;
  v_xml_header    Varchar2(500);
  v_xml_detail    Varchar2(500);
  v_item_barcode  VARCHAR2(50);
  l_cnt_rec       NUMBER DEFAULT 0;
  v_depcode       VARCHAR2(3);
  v_len number;

    l_http_request   UTL_HTTP.req;
    l_http_response  UTL_HTTP.resp;
    l_buffer_size    NUMBER(10) := 30000;
    l_line_size      NUMBER(10) := 20000;
    l_lines_count    NUMBER(10) := 1000;
    l_string_request VARCHAR2(32767);
    l_line           VARCHAR2(30000);
    l_substring_msg  VARCHAR2(30000);
    l_raw_data       RAW(30000);
    l_clob_response  CLOB;
--    l_host_name      VARCHAR2(128) := '195.128.37.14';
    l_host_name      VARCHAR2(128) := 'inatestgumrukws.unifree.com.tr';
    l_port           VARCHAR2(128) := '443'; --80: http, 443: https
    l_resp_xml        XMLType;
    l_result_XML_node VARCHAR2(128);
    l_NAMESPACE_SOAP  VARCHAR2(128) := 'xmlns:ns0=''urn:sap-com:document:sap:rfc:functions''';
    l_response_Customername   VARCHAR2(128);
    l_response_Cardname   VARCHAR2(128);
    l_response_points   number;
    L_AMOUNT  NUMBER;
    data varchar2(32767);
    name  VARCHAR2(256);
    value VARCHAR2(1024);
    i number;
    --'https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc',
  BEGIN
    UTL_HTTP.SET_WALLET('file:/oracle/Certs/wallet', 'aiadmin123');
        --  show_html_from_url('https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc');

  FOR FETCH_HEADER IN GET_HEADER LOOP 
  l_string_request := '<?xml version="1.0" encoding="UTF-8"?>
  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cus="https://unifree.com.tr/services/custom" xmlns:cus1="http://schemas.datacontract.org/2004/07/CustomServiceLibrary.DataContract">
   <soapenv:Header/><soapenv:Body><cus:SaveSales><!--Optional:--><cus:salesRequestENDataContract><cus1:Subcontractor>
    <cus1:CompanyCode>75</cus1:CompanyCode><cus1:RegionCode>98</cus1:RegionCode><cus1:StoreCode>UMT41</cus1:StoreCode>
    <cus1:CashTillCode>1</cus1:CashTillCode><cus1:CashierCode>'||FETCH_HEADER.CASH_NAT_ID||'</cus1:CashierCode></cus1:Subcontractor>
    <cus1:SalesDate><cus1:Day>'||FETCH_HEADER.GUN||'</cus1:Day><cus1:Month>'||FETCH_HEADER.AY||'</cus1:Month><cus1:Year>'||FETCH_HEADER.YIL||'</cus1:Year>
    <cus1:Hour>'||FETCH_HEADER.SAAT||'</cus1:Hour><cus1:Minute>'||FETCH_HEADER.DAKIKA||'</cus1:Minute><cus1:Second>'||FETCH_HEADER.SANIYE||'</cus1:Second>
    </cus1:SalesDate><!--Optional:--><cus1:InvoiceNumber>'||FETCH_HEADER.DOC_PROV_NO||'</cus1:InvoiceNumber><cus1:Customer>
    <cus1:IdentityType>'||FETCH_HEADER.DOC_TYPE||'</cus1:IdentityType><cus1:PassportNo>'||FETCH_HEADER.PASSPORT_NO||'</cus1:PassportNo>
    <cus1:CustomerName>'||FETCH_HEADER.PASS_SUR_NAME||'</cus1:CustomerName><cus1:DateOfBirth>
    <cus1:Day>'||TO_CHAR(FETCH_HEADER.PAS_DOB,'DD')||'</cus1:Day><cus1:Month>'||TO_CHAR(FETCH_HEADER.PAS_DOB,'MM')||'</cus1:Month>
    <cus1:Year>'||TO_CHAR(FETCH_HEADER.PAS_DOB,'YYYY')||'</cus1:Year><cus1:Hour>0</cus1:Hour><cus1:Minute>0</cus1:Minute>
    <cus1:Second>0</cus1:Second></cus1:DateOfBirth><cus1:PassengerTypeCode>'||FETCH_HEADER.PASSENGER_TYPE||'</cus1:PassengerTypeCode>
    <cus1:Arrival_Departure_Code>2</cus1:Arrival_Departure_Code></cus1:Customer><cus1:SalesLine><!--Zero or more repetitions:-->
    <cus1:SalesLine><cus1:ProductGroupCode>99</cus1:ProductGroupCode><cus1:SalesQuantity>'||FETCH_HEADER.SUM_QTY||'</cus1:SalesQuantity>
    <cus1:LimitUnitQuantity>'||FETCH_HEADER.SUM_QTY||'</cus1:LimitUnitQuantity><!--Optional:--><cus1:DolarAmount>'||FETCH_HEADER.TENDER_AMOUNT*1.12||'</cus1:DolarAmount>
    <!--Optional:--><cus1:EuroAmount>'||FETCH_HEADER.TENDER_AMOUNT||'</cus1:EuroAmount></cus1:SalesLine></cus1:SalesLine></cus:salesRequestENDataContract>
    </cus:SaveSales></soapenv:Body></soapenv:Envelope>';


    UTL_HTTP.SET_TRANSFER_TIMEOUT(200);
    l_http_request := UTL_HTTP.BEGIN_REQUEST(url => 
    --'http://inatestgumrukws.unifree.com.tr/Services/CustomService.svc?singleWsdl',method => 'POST', http_version => 'HTTP/1.1');
    'https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc');
                                          --   method => 'POST')--, http_version => 'HTTP/1.1');
    UTL_HTTP.SET_HEADER(l_http_request, 'User-Agent', 'Mozilla/4.0');
  --  UTL_HTTP.set_header(l_http_request, 'Host', l_host_name || ':' || l_port);
    UTL_HTTP.set_authentication(l_http_request,'75','Test357');
    UTL_HTTP.set_header(l_http_request, 'Connection', 'close');
    UTL_HTTP.set_header(l_http_request, 'Content-Type', 'text/xml;charset=UTF-8');
    UTL_HTTP.set_header(l_http_request, 'SOAPAction', '');
    UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(l_string_request));
    -- UTL_HTTP.write_text(l_http_request, l_string_request);
    DBMS_OUTPUT.put_line('Request>' || l_string_request || '');

    DBMS_OUTPUT.put_line('Response> content-length: "' || LENGTH(l_string_request) || '"');

  <<request_loop>>
    FOR i IN 0..CEIL(LENGTH(l_string_request) / l_buffer_size) - 1 LOOP

        l_substring_msg := SUBSTR(l_string_request, i * l_buffer_size + 1, l_buffer_size);

        BEGIN
            l_raw_data := utl_raw.cast_to_raw(l_substring_msg);
            UTL_HTTP.write_raw(r => l_http_request, data => l_raw_data);
            EXCEPTION
                WHEN NO_DATA_FOUND THEN
                    EXIT request_loop;
        END;
    END LOOP request_loop;


    l_http_response := UTL_HTTP.get_response(l_http_request);
    DBMS_OUTPUT.put_line('Response> status_code: "' || l_http_response.status_code || '"');
    DBMS_OUTPUT.put_line('Response> reason_phrase: "' ||l_http_response.reason_phrase || '"');
    DBMS_OUTPUT.put_line('Response> http_version: "' ||l_http_response.http_version || '"');


    IF l_http_response.status_code = '200' AND l_http_response.reason_phrase = 'OK' THEN
            --null;
    UPDATE OFF_SENT_SALES@MOSIAT
    SET SENT_FLAG = 9
    WHERE SALE_REF_NO = FETCH_HEADER.SALE_REF_NO
    AND DOC_PROV_NO = FETCH_HEADER.TRANSNUMBER;

    END IF;

   BEGIN

        <<response_loop>>
        LOOP
            UTL_HTTP.read_raw(l_http_response, l_raw_data, l_buffer_size);
            l_clob_response := l_clob_response || UTL_RAW.cast_to_varchar2(l_raw_data);
        END LOOP response_loop;

        EXCEPTION
            WHEN UTL_HTTP.end_of_body THEN
                UTL_HTTP.end_response(l_http_response);
    END;    


    DBMS_OUTPUT.put_line('Response> length: "' || LENGTH(l_clob_response) || '"');
   -- DBMS_OUTPUT.put_line('Response> ' || (l_clob_response) || '"');
    DBMS_OUTPUT.put_line(CHR(10) || '=== Print first ' || l_lines_count || ' lines of HTTP response... ===' || CHR(10) || CHR(10));


    FOR i IN 0..CEIL(LENGTH(l_clob_response) / l_line_size) - 1 LOOP
        l_line := SUBSTR(l_clob_response, i * l_line_size + 1, l_line_size);
        DBMS_OUTPUT.put_line('[' || LPAD(i, 2, '0') || ']: ' || l_line);
        EXIT WHEN i > l_lines_count - 1;
    END LOOP print_response;

  IF l_http_request.private_hndl IS NOT NULL THEN
        UTL_HTTP.end_request(l_http_request);
    END IF;

    IF l_http_response.private_hndl IS NOT NULL THEN
        UTL_HTTP.end_response(l_http_response);
    END IF;

end loop;
commit;
     EXCEPTION
      WHEN UTL_HTTP.TOO_MANY_REQUESTS THEN
           BEGIN
    DBMS_OUTPUT.put_line('Response> status_code: "' || l_http_response.status_code || '"' ||'-error');
    DBMS_OUTPUT.put_line('Response> reason_phrase: "' ||l_http_response.reason_phrase || '"');
    DBMS_OUTPUT.put_line('Response> http_version: "' ||l_http_response.http_version || '"');           
             UTL_HTTP.END_RESPONSE(l_http_response);
           END ;
      WHEN UTL_HTTP.REQUEST_FAILED  then
    DBMS_OUTPUT.put_line('Response> status_code: "' || l_http_response.status_code || '"' ||'-error');
    DBMS_OUTPUT.put_line('Response> reason_phrase: "' ||l_http_response.reason_phrase || '"');
    DBMS_OUTPUT.put_line('Response> http_version: "' ||l_http_response.http_version || '"');      
   END   SALES_XML_CUSTOMS_PRC; 

我从plsql收到以下响应,但未给出实际结果,我想让专家检查我的代码,我在哪里做错了,究竟是什么问题

示例响应

Response> content-length: "1758"
Response> status_code: "200"
Response> reason_phrase: "OK"
Response> http_version: "HTTP/1.1"
Response> length: "3126"
=== Print first 1000 lines of HTTP response... ===
[00]: <HTML><HEAD><link rel="alternate" type="text/xml" href="https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc?disco"/><STYLE type="text/css">#content{ FONT-SIZE: 0.7em; PADDING-BOTTOM: 2em; MARGIN-LEFT: 30px}BODY{MARGIN-TOP: 0px; MARGIN-LEFT: 0px; COLOR: #000000; FONT-FAMILY: Verdana; BACKGROUND-COLOR: white}P{MARGIN-TOP: 0px; MARGIN-BOTTOM: 12px; COLOR: #000000; FONT-FAMILY: Verdana}PRE{BORDER-RIGHT: #f0f0e0 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #f0f0e0 1px solid; MARGIN-TOP: -5px; PADDING-LEFT: 5px; FONT-SIZE: 1.2em; PADDING-BOTTOM: 5px; BORDER-LEFT: #f0f0e0 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #f0f0e0 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e5e5cc}.heading1{MARGIN-TOP: 0px; PADDING-LEFT: 15px; FONT-WEIGHT: normal; FONT-SIZE: 26px; MARGIN-BOTTOM: 0px; PADDING-BOTTOM: 3px; MARGIN-LEFT: -30px; WIDTH: 100%; COLOR: #ffffff; PADDING-TOP: 10px; FONT-FAMILY: Tahoma; BACKGROUND-COLOR: #003366}.intro{MARGIN-LEFT: -15px}</STYLE><TITLE>CustomServiceEN Service</TITLE></HEAD><BODY><DIV id="content"><P class="heading1">CustomServiceEN Service</P>
<BR/><P class="intro">You have created a service.<P class='intro'>To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:</P> <BR/><PRE>svcutil.exe <A HREF="https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc?wsdl">https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc?wsdl</A></PRE><P>You can also access the service description as a single file:<BR/><PRE><A HREF="https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc?singleWsdl">https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc?singleWsdl</A></PRE></P></P><P class="intro"/>This will generate a configuration file and a code file that contains the client class. Add the two files to your client application and use the generated client class to call the Service. For example:<BR/><P class='intro'>

<B>C#</B></P><PRE><font color="blue">class </font><font color="teal">Test
</font>{
<font color="blue"> static void </font>Main()
{
<font color="teal">CustomServiceENClient</font> client = <font color="blue">new </font><font color="teal">CustomServiceENClient</font>();
<font color="green"> // Use the 'client' variable to call operations on the service.
</font><font color="green"> // Always close the client.
</font> client.Close();
}
}
</PRE><BR/><P class='intro'><B>Visual Basic</B></P><PRE><font color="blue">Class </font><font color="teal">Test
</font><font color="blue"> Shared Sub </font>Main()
<font color="blue"> Dim </font>client As <font color="teal">CustomServiceENClient</font> = <font color="blue">New </font><font color="teal">CustomServiceENClient</font>()
<font color="green"> ' Use the 'client' variable to call operations on the service.
</font><font color="green"> ' Always close the client.
</font> client.Close()
<font color="blue"> End Sub
</font><font color="blue">End Class</font></PRE></DIV></BODY></HTML>

SOAPAction

soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/QueryLimit" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/QueryLimitOnlyForOtherCompanies" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/SaveSales" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/CancelSales" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/GetCulture" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/QueryLimit" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/QueryLimitOnlyForOtherCompanies" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/SaveSales" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/CancelSales" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/GetCulture" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/QueryLimit" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/QueryLimitOnlyForOtherCompanies" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/SaveSales" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/CancelSales" style="document"/>
soapAction="https://unifree.com.tr/services/custom/ICustomServiceEN/GetCulture" style="document"/>

1 个答案:

答案 0 :(得分:0)

原因可能是由于SOAPAction网址为空。根据您的样本响应,我可以看到WSDL Url,单击WSDL URL-> https://inatestgumrukws.unifree.com.tr/Services/CustomService.svc?wsdl并搜索SOAPAction,然后将URL复制到以下代码,然后重试。希望对您有帮助。

UTL_HTTP.set_header(l_http_request, 'SOAPAction', '<SOAPActionUrl>');
相关问题