在用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.