PI-webservice05-SAP調用外部webservice


在用webservice進行數據傳輸的過程中,SAP系統與.net開發的信息系統之間的數據調用。如何用SAP調用外部的.net系統發布的webservice程序來獲取外部的數據,詳情請見下文:

 1,創建代理

事務碼:SE80

【右鍵】-【create】-【enterprise service】

 

選擇【service consumer】點擊【繼續】

選擇【URL/HTTP Destination】,點擊【繼續】

填寫URL地址,地址是wsdl結尾的地址,然后點擊【繼續】

package處輸入程序包,prefix處輸入名稱,request/task中輸入請求號名稱,點擊【繼續】

點擊【complete】

然后點擊【保存】,然后進行【激活】,則代理就創建好了

2,調用邏輯代理端口

事務碼:LPCONFIG

填寫【代理類】名稱,【邏輯端口】名稱(代理名稱就是上創建的代理名稱,邏輯端口名稱與代理類名稱相同即可),勾選【缺省端口】,點擊創建

填寫【描述】,勾選【全局設置】中的【狀態管理】,保存

填寫【調用參數】中的URL地址(以?wsdl結束的地址),然后保存

輸入對應的URL地址中的對應方法的soapAction找到如下部分代碼:

 

將其中的soapaction部分放入到SOAP操作,點擊【保存】,然后點擊【激活】

3,創建調用程序

事務碼:SE38

 

填寫程序名稱,點擊【創建】

填寫【title】,選擇【type】,然后點擊【保存】

選擇【開發類】,點擊【保存】,輸入請求號,程序就創建好了

SAP程序中撰寫調用.net中的webservice的中的helloworld方法程序,直接第1步中創建好的代理拖拉到創建好的程序中,則會自動生成代碼,將代碼修改如下所示: 

 

"定義調用函數名稱
DATA: ZHELLOWORLD TYPE REF TO ZCRM_DELIVERYCO_SERVICE_SOAP .
TRY.
    CREATE OBJECT ZHELLOWORLD
*  EXPORTING
"定義邏輯端口名稱
    LOGICAL_PORT_NAME  = 'ZCRM_DELIVERYCO_SERVICE_SOAP'
        .
  CATCH CX_AI_SYSTEM_FAULT .
ENDTRY.
"定義輸入輸出參數類型
   data: ZOUTPUT type ZCRM_DELIVERY_WSHELLO_WORLD_SO .
   data: ZINPUT type ZCRM_DELIVERY_WSHELLO_WORLD_S1 .
TRY.
CALL METHOD XXXXXXXX->HELLO_WORLD
  EXPORTING
    INPUT  = ZINPUT
  IMPORTING
    OUTPUT = ZOUTPUT
    .
* CATCH CX_AI_SYSTEM_FAULT .
* CATCH CX_AI_APPLICATION_FAULT .
ENDTRY.

通過調試上述代碼,則可以看到調用到的數據

如果對方給定的webservice的URL地址中包含有消息頭文件,則在程序中需要添加消息頭文件的說明,其代碼如下:

REPORT  ZHELLOWORLD.
"聲明消息頭header文件
data: ws_header TYPE REF TO if_wsprotocol_ws_header,
       name TYPE string,
       namespace TYPE string.

DATA: ZHELLOWORLD TYPE REF TO ZCRM_DELIVERYCO_SERVICE_SOAP .
TRY.
    CREATE OBJECT ZHELLOWORLD
*  EXPORTING
*    LOGICAL_PORT_NAME  =
        .

  ws_header ?= ZHELLOWORLD->get_protocol('IF_WSPROTOCOL_WS_HEADER').
    DATA: ixml TYPE REF TO if_ixml,

          xml_document TYPE REF TO if_ixml_document,

          xml_root TYPE REF TO if_ixml_element,

          xml_element TYPE REF TO if_ixml_element,

          xml_node TYPE REF TO if_ixml_node.

    DATA l_xstring        TYPE xstring.

    DATA l_string         TYPE string.

    FIELD-SYMBOLS <fs_xstring> TYPE xstring.

  CONCATENATE
  
"消息頭文件header中的內容
'<soap:Header>'

'<s1:MySoapHeader xmlns:s1="http://tempuri.org/">'

"'<s1:RegisteredUser>'

'<s1:Uname>admin</s1:Uname>'

'<s1:Password>admin</s1:Password>'

"'</s1:RegisteredUser>
'</s1:MySoapHeader>'

'</soap:Header>' INTO l_string.

 l_xstring = cl_proxy_service=>cstring2xstring( l_string ).

 IF NOT l_string IS INITIAL.
     CALL FUNCTION 'SDIXML_XML_TO_DOM'

        EXPORTING

          xml           = l_xstring

        IMPORTING

          document      = xml_document

        EXCEPTIONS

          invalid_input = 1

          OTHERS        = 2.


      IF sy-subrc = 0 AND NOT xml_document IS INITIAL.

        xml_root = xml_document->get_root_element( ).

        xml_element ?= xml_root->get_first_child( ).

        WHILE NOT xml_element IS INITIAL.

          name = xml_element->get_name( ).

          namespace = 'http://tempuri.org/' . "xml_element->get_namespace_uri( ).

          IF NOT xml_element IS INITIAL.


          ENDIF.


          ws_header->set_request_header(

                      name = name

                      namespace = namespace

                      dom = xml_element ).


          xml_element ?= xml_element->get_next( ).

        ENDWHILE.

      ENDIF.
    ENDIF.
  CATCH CX_AI_SYSTEM_FAULT .
ENDTRY.

   data: OUTPUT type ZCRM_DELIVERY_WSHELLO_WORLD_SO .
   data: INPUT type ZCRM_DELIVERY_WSHELLO_WORLD_S1 .

TRY.
CALL METHOD ZSALES->HELLO_WORLD
  EXPORTING
    INPUT  = ZINPUT
  IMPORTING
    OUTPUT = ZOUTPUT
    .
* CATCH CX_AI_SYSTEM_FAULT .
* CATCH CX_AI_APPLICATION_FAULT .
ENDTRY.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM