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.

你可能感兴趣的:(webservice)