美文网首页
sap调用webservice修改代理类中的http heade

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

作者: rootbin | 来源:发表于2019-06-25 17:15 被阅读0次

通常的操作,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也是一种输入参数
    soap ui解析.png
  • sap 代理类
    没有传参的地方


    sap 代理类.png

解决方案

IF_PROXY_BASIS~GET_PROTOCOL

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


CL_WSPROTOCOL_WS_HEADER.png

部分代码

  • 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.

相关文章

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

    通常的操作,webservice 直接生成代理类,验证信息在logic port中配置。最近的一次集成,验证信息需...

  • NetCore 调用WebService

    引用WebService 引用成功 调用WebService接口 http *https

  • SAP发布WebService和JAVA互联

    原理:SAP通过发布WEBService,java代码去调用,从而控制sap的操作。这一方案可以将sap的业务拿到...

  • Asp.net Core 调用Web Service

    1.引言 .net core 使用自动生成的代理类调用soap 协议的WebService的方式。 2.问题描述 ...

  • http调用webservice

    工作时由于xml字符串的多样性,soap的方式走不通,可以转变思路用http的方式实现 1、pom文件 2、htt...

  • JAVA_代理_静态代理

    代理类和目标类实现相同的接口,在代理类中维护目标类的对象,以此实现对目标对象方法的调用。 优点:可以实现不修改目标...

  • 2020-02-26

    WebService的Postman调用 1.直接用http的POST方式调用 http:// url/XXX/G...

  • java基础之代理模式

    静态代理 代理类与被代理类实现同一个接口或者父类,代理类中存在被代理类的引用,代理类中重写的方法内部调用添加的逻辑...

  • 大话设计模式——代理模式

    代理其实就是一个代理类持有被代理的引用,然后通过调用代理类的方法调用被代理的类。

  • Http调用SAP RFC函数工具类

    Http 访问SAP RFC函数工具类 最近公司需要将SAP RFC函数接口提供给第三方,但是很多第三方对于RFC...

网友评论

      本文标题:sap调用webservice修改代理类中的http heade

      本文链接:https://www.haomeiwen.com/subject/aodxcctx.html