sap调用webservice修改代理类中的http heade

2019-06-25  本文已影响0人  rootbin

通常的操作,webservice 直接生成代理类,验证信息在logic port中配置。最近的一次集成,验证信息需要额外放在http header 中,查找相关资料后,对于sap自动生成的代理类,还是有一定的自定义空间。
参考链接: https://wiki.scn.sap.com/wiki/display/Java/Consume+SOAP+WebService+by+SAP+and+add+custom+Header

webservice定义

解决方案

IF_PROXY_BASIS~GET_PROTOCOL

代理类实现了IF_PROXY_BASIS接口,用GET_PROTOCOL方法可以获取SAP内部封装若干协议对象(如截图所示),
其中实现类CL_WSPROTOCOL_WS_HEADER可以用于修改http header


CL_WSPROTOCOL_WS_HEADER.png

部分代码

部分代码,删除了敏感信息


* # 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.
上一篇下一篇

猜你喜欢

热点阅读