PI-webservice05-SAP調用外部webservice

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

 1,建立代理web

事務碼:SE80dom

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

 

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

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

填寫URL地址,地址是wsdl結尾的地址,而後點擊【繼續】代理

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

點擊【complete】xml

而後點擊【保存】,而後進行【激活】,則代理就建立好了事務

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.
相關文章
相關標籤/搜索