zoukankan      html  css  js  c++  java
  • PI-webservice05-SAP调用外部webservice

    在用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.
  • 相关阅读:
    大话计算机网络一 聊聊UDP
    Go调度器系列(2)宏观看调度器
    Go语言高阶:调度器系列(1)起源
    gin+go-micro+etcd实战一
    记录一次云主机部署openstack的血泪史
    paste deploy 学习笔记
    Openstack计算Nova组件
    jumpserver docker简单搭建
    [原创][开源] SunnyUI.Net 帮助文档目录
    [原创][开源]SunnyUI.Net, C# .Net WinForm开源控件库、工具类库、扩展类库、多页面开发框架
  • 原文地址:https://www.cnblogs.com/dekevin/p/3577038.html
Copyright © 2011-2022 走看看