通常的操作,webservice 直接生成代理类,验证信息在logic port中配置。最近的一次集成,验证信息需要额外放在http header 中,查找相关资料后,对于sap自动生成的代理类,还是有一定的自定义空间。
参考链接: https://wiki.scn.sap.com/wiki/display/Java/Consume+SOAP+WebService+by+SAP+and+add+custom+Header
webservice定义
- soap ui 解析
可以直接观测到soap header也是一种输入参数
-
sap 代理类
没有传参的地方
解决方案
IF_PROXY_BASIS~GET_PROTOCOL
代理类实现了IF_PROXY_BASIS接口,用GET_PROTOCOL方法可以获取SAP内部封装若干协议对象(如截图所示),
其中实现类CL_WSPROTOCOL_WS_HEADER可以用于修改http header
部分代码
- xml的格式从soap ui 中获取
- protoco
l 对header内容的更改需要使用ixml
部分代码,删除了敏感信息
* # io_proxy (SAP自动生成的代理类) 获取header 对象
DATA: lo_header TYPE REF TO if_wsprotocol_ws_header.
lo_header ?= io_proxy->get_protocol( if_wsprotocol=>ws_header ).
* # 需要的xml添加到Header中
DATA:
lo_document TYPE REF TO if_ixml_document,
lo_root TYPE REF TO if_ixml_element,
lo_element TYPE REF TO if_ixml_element,
lo_node TYPE REF TO if_ixml_node.
DATA: ld_raw TYPE string,
ld_x TYPE xstring,
ld_name TYPE string,
ld_namespace TYPE string.
* ## 设置账号
prepare_account_info( ).
* ## 构造需要的xml
" 此结构是通过soapui解析后看到需要的数据结构
CONCATENATE
'<soap:Header>'
'<tem:MySoapHeader xmlns:tem="http://tempuri.org/">'
'<tem:UserName>' md_username '</tem:UserName>'
'<tem:PassWord>' md_pw_md5 '</tem:PassWord>'
'</tem:MySoapHeader>'
'</soap:Header>' INTO ld_raw.
* ## 使用imxl来解析
ld_x = cl_proxy_service=>cstring2xstring( ld_raw ).
CALL FUNCTION 'SDIXML_XML_TO_DOM'
EXPORTING
xml = ld_x
IMPORTING
document = lo_document
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
IF sy-subrc = 0 AND NOT lo_document IS INITIAL.
" - 提取需要的节点
lo_root = lo_document->get_root_element( ).
lo_element ?= lo_root->get_first_child( ). "目标节点
" - 追加到header对象中
WHILE NOT lo_element IS INITIAL.
ld_name = lo_element->get_name( ).
ld_namespace = lo_element->get_namespace_uri( ).
lo_header->set_request_header( name = ld_name
namespace = ld_namespace
dom = lo_element ).
lo_element ?= lo_element->get_next( ).
ENDWHILE.
ENDIF.