SAP调WebService接口,以XML格式进行传输,添加用户名和密码校验
webservice 直接生成代理类,验证信息在SOAMANAGER中配置。
验证信息需要额外放在http header 中,查找相关资料后,对于sap自动生成的代理类,还是有一定的自定义空间 。
代码示例:
参考链接:https://wiki.scn.sap.com/wiki/display/Java/Consume+SOAP+WebService+by+SAP+and+add+custom+Header
"转换XML DATA: lv_xml1 TYPE xstring. DATA: lv_xml2 TYPE string. DATA: lt_itab TYPE TABLE OF zsd_dms_sales . DATA: lv_oref TYPE REF TO cx_st_error, lv_message TYPE string, lv_msg TYPE string. DATA obj_exception TYPE REF TO cx_ai_system_fault. "定义接口传输接口 DATA:ls_input TYPE zsap_update_order_info_soap_in, ls_output TYPE zsap_update_order_info_soap_in. "调用DMS接口 DATA:lv_service TYPE REF TO zco_sap_interface_soap. DATA:lv_sys_exception TYPE REF TO cx_ai_system_fault, lv_app_exception TYPE REF TO cx_ai_application_fault. 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. DATA: name TYPE string, namespace TYPE string. DATA: lr_header TYPE REF TO if_wsprotocol_ws_header. DATA:lr_ex_system TYPE REF TO cx_ai_system_fault. "内表赋值 "将XML转化为内表 TRY . CALL TRANSFORMATION zsd_dms_0001 OPTIONS xml_header = 'no' SOURCE zsd_dms_sales = lt_itab RESULT XML lv_xml1. "2进制转换XML字符串不乱码 CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING' EXPORTING im_xstring = lv_xml1 "二进制字符串 im_encoding = 'UTF-8' IMPORTING ex_string = lv_xml2. "返回的xml字符串 CATCH cx_st_error INTO lv_oref. "传输XML转换错误 lv_message = lv_oref->get_text( ) . "报错日志保存 ENDTRY. "赋值 XML 文件 CLEAR:ls_input,ls_output . ls_input-xml = lv_xml2 . "$. Region BY 添加http herder 验证信息 TRY. CREATE OBJECT lv_service EXPORTING logical_port_name = 'ZSD01' "逻辑端(SOAMANAGER) EXCEPTIONS OTHERS = 1. lr_header ?= lv_service->get_protocol( if_wsprotocol=>ws_header ). CATCH cx_ai_system_fault INTO lr_ex_system. ENDTRY. CLEAR l_string . CONCATENATE '<soap:Header>' '<ser:AuthHeader xmlns:ser="https://testdms.bscwin.com/services">' '<ser:User>用户名</ser:User>' '<ser:Password>密码</ser:Password>' '</ser:AuthHeader>' '</soap:Header>' INTO l_string. "convert to xstring CLEAR l_xstring . l_xstring = cl_proxy_service=>cstring2xstring( l_string ). IF l_string IS NOT INITIAL. "create ixml dom document from xml xstring 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( ). "add header element by element to soap header WHILE xml_element IS NOT INITIAL. name = xml_element->get_name( ). namespace = xml_element->get_namespace_uri( ). lr_header->set_request_header( name = name namespace = namespace dom = xml_element ). xml_element ?= xml_element->get_next( ). ENDWHILE. ENDIF. ENDIF. "$. Endregion BY 添加http herder 验证信息 TRY. CALL METHOD lv_service->sap_update_order_info EXPORTING input = ls_input IMPORTING output = ls_output. CATCH cx_ai_system_fault INTO lv_sys_exception . WRITE lv_sys_exception->errortext. CATCH cx_ai_application_fault INTO lv_app_exception . * WRITE lv_app_exception->textid. ENDTRY.