【转自http://blog.csdn.net/yin_chuan_lang/article/details/6706816】

最近的项目中,接口较多,而Webservice技术是主要实现方式之一。下面以项目中的一个具体实例来体验一下基于PI的Webservice发布。 业务场景 SAP系统实时接收一个外围接口系统(基于Web的电子商务平台)回传的数据。 技术分析 由于同步要求较高,数据量偏小,采用Webservice实现较为合理。 实例演示 创建好自建表,用于接收回传的数据: TC: SPROXY根据集成组在PI配置的服务名创建Service Interface 在实现类中,根据传入的XML字符串,解析后更新到自建表: data: ls_field_data like zmmjyh_cdif, lt_field_data like table of ls_field_data, ls_zmmjyh_ht_0007 like zmmjyh_ht_0007, lt_zmmjyh_ht_0007 like table of ls_zmmjyh_ht_0007, l_retcode type i, l_fieldname type string, l_float type f. field-symbols: <fs_fieldname> type any, <fs_fieldvalue> type any. "解析XML数据到通用内表 type-pools: ixml. types: begin of t_xml_line , data(256) type x, end of t_xml_line. data: l_ixml type ref to if_ixml, l_streamfactory type ref to if_ixml_stream_factory, l_parser type ref to if_ixml_parser, l_istream type ref to if_ixml_istream, l_document type ref to if_ixml_document, l_node type ref to if_ixml_node, l_xmldata type string. data: l_elem type ref to if_ixml_element, l_root_node type ref to if_ixml_node, l_next_node type ref to if_ixml_node, l_name type string, l_iterator type ref to if_ixml_node_iterator. data: l_xml_table type table of t_xml_line, l_xml_line type t_xml_line, l_xml_table_size type i. * Creating the main iXML factory l_ixml = cl_ixml=>create( ). * Creating a stream factorya l_streamfactory = l_ixml->create_stream_factory( ). l_istream = l_streamfactory->create_istream_string( string = input ). * Creating a document l_document = l_ixml->create_document( ). * Create a Parser l_parser = l_ixml->create_parser( stream_factory = l_streamfactory istream = l_istream document = l_document ). * Parse the stream if l_parser->parse( ) ne 0. l_retcode = 0. return . endif. * Process the document if l_parser->is_dom_generating( ) eq 'X'. perform process_dom tables lt_field_data using l_document . endif. *&--------------------------------------------------------------------* *& Form process_dom *&--------------------------------------------------------------------* form process_dom tables p_i_zxml structure zmmjyh_cdif using document type ref to if_ixml_document . data: node type ref to if_ixml_node, iterator type ref to if_ixml_node_iterator, nodemap type ref to if_ixml_named_node_map, node_parent type ref to if_ixml_node, attr type ref to if_ixml_node, name type string, name1 type string, prefix type string, value type string, indent type i, count type i, index type i. node ?= document. check not node is initial. if node is initial. exit. endif. * create a node iterator iterator = node->create_iterator( ). * get current node node = iterator->get_next( ). * loop over all nodes while not node is initial. indent = node->get_height( ) * 2. indent = indent + 20. case node->get_type( ). when if_ixml_node=>co_node_element. * element node name = node->get_name( ). nodemap = node->get_attributes( ). if not nodemap is initial. * attributes count = nodemap->get_length( ). do count times. index = sy-index - 1. attr = nodemap->get_item( index ). name = attr->get_name( ). prefix = attr->get_namespace_prefix( ). value = attr->get_value( ). "记录字段名、字段值 p_i_zxml-fieldname = name . p_i_zxml-fieldvalue = value . append p_i_zxml . enddo. endif. when if_ixml_node=>co_node_text or if_ixml_node=>co_node_cdata_section. * text node value = node->get_value( ). node_parent = node->get_parent( ). name1 = node_parent->get_name( ). "记录字段名、字段值 p_i_zxml-fieldname = name1 . p_i_zxml-fieldvalue = value . append p_i_zxml . endcase. node = iterator->get_next( ). endwhile. endform. "process_dom "准备数据到数据库更新内表 loop at lt_field_data into ls_field_data. clear l_fieldname. assign ls_field_data-fieldvalue to <fs_fieldvalue>. concatenate 'LS_ZMMJYH_HT_0007-' ls_field_data-fieldname into l_fieldname. assign (l_fieldname) to <fs_fieldname>. if <fs_fieldname> is assigned. if ls_field_data-fieldname = 'CONTRAMOUNTNUM' or ls_field_data-fieldname = 'APPLYAMOUNT'. "金额字段中科学计数法的处理 clear l_float. l_float = <fs_fieldvalue>. <fs_fieldname> = l_float. else. <fs_fieldname> = <fs_fieldvalue>. endif. else. it_return-zresult = '0'. it_return-description = '程序异常,字段名不匹配!'. append it_return. return. endif. "到达一条数据末尾 if ls_field_data-fieldname = 'PREPAYID'. append ls_zmmjyh_ht_0007 to lt_zmmjyh_ht_0007. clear ls_zmmjyh_ht_0007. endif. endloop. "更新到自建表 if lines( lt_zmmjyh_ht_0007 ) > 0 . modify zmmjyh_ht_0007 from table lt_zmmjyh_ht_0007. if sy-subrc = 0. commit work and wait. it_return-zresult = '1'. it_return-description = '回传成功!'. append it_return. else. rollback work. it_return-zresult = '0'. it_return-description = '回传失败,数据库更新异常!'. append it_return. endif. else. it_return-zresult = '0'. it_return-description = '无数据可传输!'. append it_return. endif. 把结果回传给外围系统,先创建好Transformation 然后把返回值封装成XML串: data:l_xstr type xstring. call transformation zmmjyhmesgjdzsw source root = it_return[] * RESULT XML output result xml l_xstr options xml_header = 'no' . types: begin of ty_bin, bin_data(1024) type x, end of ty_bin. data:lt_bin type table of ty_bin."文件二进制内表 data:l_len type i. check input is not initial. call function 'SCMS_XSTRING_TO_BINARY' exporting buffer = l_xstr * APPEND_TO_TABLE = ' ' importing output_length = l_len tables binary_tab = lt_bin . call function 'SCMS_BINARY_TO_STRING' exporting input_length = l_len * FIRST_LINE = 0 * LAST_LINE = 0 * MIMETYPE = ' ' * ENCODING = importing text_buffer = output-zmmjyht010response-output * OUTPUT_LENGTH = tables binary_tab = lt_bin * EXCEPTIONS * FAILED = 1 * OTHERS = 2 . if sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. endif. 由于是基于PI创建的,此时的Webservice还没有注册,TC:SOAMANAGER 进入single serviceadministration,搜索刚才创建的webservice:Zmmjyht010,并apply selection 点选Configurations标签,创建服务: 记得勾选中 User ID/Password 点击 show wsdl options,并把 WSDL Format 设置为standard,然后点选Display selectedBinding's WSDL URL, 在右边会得到WSDL的URL 在SICF中,找到服务 Zmmjyht010,在登录数据里,把过程数据改为 “标准”,这是为了跳过WSDL的安全策略。

基于PI的Webservice发布实例的更多相关文章

  1. 基于JAX-WS的webService开发实例

    最近因为工作原因接触到webService,所以记录下开发中碰到的问题,方便自己以后复习,顺便发扬一下开源精神.刚刚接触webServie如果有什么错误欢迎大家指正. 本地环境:myEclipse10 ...

  2. python发布及调用基于SOAP的webservice

    现如今面向服务(SOA)的架构设计已经成为主流,把公用的服务打包成一个个webservice供各方调用是一种非常常用的做法,而应用最广泛的则是基于SOAP协议和wsdl的webservice.本文讲解 ...

  3. Java WebService入门实例

    Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描述 ...

  4. WebService入门实例教程

    什么是WebService 通过使用WebService,您的应用程序可以向全世界发布信息,或提供某项功能,它是基于Web的服务,通过Web进行发布.查找和使用. WebService脚本平台需支持X ...

  5. 基于.NET的WebService的实现和WCF的实现

    1.新建一个MVC web项目. 2.点击项目,[右键]→[添加]→[新建项] 3.点击[Web]→[Web服务] 4.恭喜,Web Service已经新建成功,里面的方法就可以参考着根据自己的需要进 ...

  6. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  7. 【转】构建基于CXF的WebService服务

    构建基于CXF的WebService服务 Apache CXF = Celtix+ XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.C ...

  8. Webservice发布

    此文甚好,转载自:http://blog.163.com/java_player@126/blog/static/127930738200981555021925/ 某些地方笔者已经加以改进. 使用工 ...

  9. Myeclipse8.5上基于JAX-WS开发WebService

    1.JAX-WS介绍 JAX-WS规范是一组XML web services的JAVA API. 2.开发步骤 基于JAX-WS的WebService开发步骤如下: 2.1 新建一个Web Servi ...

随机推荐

  1. 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。

    “Win32Project3.exe”(Win32): 已加载“D:\software\VS2013\VS2013 文档\Win32Project3\Debug\Win32Project3.exe”. ...

  2. 基于JWT的Token开发案例

    代码地址如下:http://www.demodashi.com/demo/12531.html 0.准备工作 0-1运行环境 jdk1.8 maven 一个能支持以上两者的代码编辑器,作者使用的是ID ...

  3. git个人使用总结(界面版)

    最近开始使用GIT来管理测试文档,从0到1开始使用git 1.首先,使用网页登录GIT后,创建项目 2.创建项目后,需要配置一下访问者权限 3.然后在网页版GIT复制地址,git clone到 本地 ...

  4. ios7中的edgesForExtendedLayout

    edgesForExtendedLayout是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向. 因为iOS7鼓励全屏布局,所以它的默认值是UIRectEdgeAll——四周边缘都延 ...

  5. Atitit.常见的4gl 第四代编程语言  与 dsl

    Atitit.常见的4gl 第四代编程语言  与 dsl 1. 4gl dsl发展历史1 2. 4gl dsl的特点1 3. 常见的4gl 第四代编程语言 dsl2 4. 未来趋势与标准2 4.1.1 ...

  6. Eureka 源码编译安装部署---Eureka运行eureka-server服务

    ---恢复内容开始--- 折腾了几天,终于运行好了,两个字:佩服 首先感谢这个大佬的博客支持:https://www.cnblogs.com/lifuping/p/5663127.html 1.首先在 ...

  7. JSTL JSP页面推断某个cookie的值和读取值....

    <c:if test="${cookie['woshop'].value eq '1'}">                 <div>           ...

  8. kubernetes高级之动态准入控制

    系列目录 动态准入控制器文档介绍了如何使用标准的,插件式的准入控制器.但是,但是由于以下原因,插件式的准入控制器在一些场景下并不灵活: 它们需要编译到kube-apiserver里 它们仅在apise ...

  9. [译]GLUT教程 - 游戏模式

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...

  10. 高度平衡树 -- AVL 树

    Scheme 的表达, 优雅. #lang scheme ( define nil '() ) ( define ( root tree )( car tree ) ) ( define ( left ...