ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SAP WebService发布与消费完整指南:从SE37到SOAMANAGER

SAP WebService发布与消费完整指南:从SE37到SOAMANAGER 简介面向SAP开发与系统集成人员这份文档以图文步骤形式完整梳理了在SAP上发布和调用Web服务的流程。内容涵盖服务端发布用SE37创建函数模块、生成并激活服务通过SOAMANAGER配置接口、查看WSDL也涵盖客户端消费用SE80创建代理类、导入外部服务描述、激活代理、配置Consumer Proxy与逻辑端口并完成调用测试。针对不同SAP版本在SOAMANAGER界面上的差异文档给出了兼容性说明帮助初中级顾问避开常见问题。整个流程从发布到消费均有清晰指引覆盖了WSDL理解、代理类激活、逻辑端口创建等容易被忽略的环节能显著降低接口联调中的试错成本适合作为团队内部培训或快速上手的操作手册。该文档为单个docx文件大小约1.64MB便于携带阅读已有864人学习下载适合ERP集成、企业接口开发场景下的落地参考。1. 为什么要把 SAP 的功能发布成 WebService接口对接的入口在哪做 SAP 和外部系统联调时几乎所有人都会碰上“你们给我个 WebService 吧”这句话。非 SAP 同事默认 SAP 也像 Java、.NET 一样写个接口、发布个 WSDL 就能互相调实际上 SAP 要走的链路更深SE37 函数模块、SOAMANAGER 服务配置、SPROXY 代理类三个入口来回切中间还夹着 ICF 节点、逻辑端口、无权限认证这些细节。我把自己从发布到消费的完整链路拆在这里——先用 SE37 把一个函数模块发布成可访问的 WebService再让 SAP 反过来消费外部系统的 WebService每步都带事务代码和参数。适合做接口集成的 ABAP 顾问也适合被 ERP 系统对接缠住的 BASIS只要按步骤走一遍你会发现 SAP 里 WebService 配置不是黑匣子坑也就那么几个。2. 用 SE37 发布 WebService从函数选型到激活的完整链路2.1 为什么发布源必须是规范的远程函数模块SAP 发布 WebService 的本质是把函数模块的导入、导出、表参数映射成 SOAP 消息再由 NetWeaver 运行时把 SOAP 报文翻译回 ABAP 数据。这个机制决定了发布源必须是“远程启用的函数模块”——在 SE37 属性页里“处理类型”必须勾选“远程启用的模块”。普通报表、本地函数发布出去要么生成阶段直接报错要么生成的 WSDL 缺少参数结构外部系统根本没法用。我习惯单独建一个 Z 开头的函数模块只暴露外部系统真正需要的输入输出比如下面这个 ZGET_USR02入参传用户名出参返回语言、最后登录日期FUNCTION ZGET_USR02. *---------------------------------------------------------------------- **本地接口 * IMPORTING * VALUE(I_BNAME) TYPE USR02-BNAME * EXPORTING * VALUE(E_LANGU) TYPE USR02-LANGU * VALUE(E_LDAT) TYPE USR02-LDAT *---------------------------------------------------------------------- SELECT SINGLE langu, ldat FROM usr02 INTO (e_langu, e_ldat) WHERE bname i_bname. IF sy-subrc 0. CLEAR: e_langu, e_ldat. ENDIF. ENDFUNCTION.这段代码的核心在接口定义部分I_BNAME、E_LANGU 这些参数全部引用 SE11 里已存在的类型没有用函数内部临时定义的结构。这样发布时生成的 WSDL 里字段名基本和 ABAP 名一致外部系统照着抓字段就行不用猜。如果换成一个返回内表的查询WSDL 会出现多层 complexType对方写脚本的人多半会来骂你。参数类型的约束要提前讲给团队表类型、结构类型尽量用 SE11 显式定义不要在函数代码里临时到处 DEFINE。跨系统对接时字段名就是契约契约不稳定后面全是血泪。另外函数模块的“处理类型”如果没勾远程启用发布向导会在校验时直接弹红别等到生成服务定义才回头改属性。2.2 SE37 里创建 WebService 的五个关键步骤函数模块测试无误后发布动作本身很快但选项要选对。打开 SE37输入 ZGET_USR02 进入函数模块编辑界面然后按下面顺序走菜单栏点“实用程序”展开“更多实用程序”找到“创建 Web 服务”子菜单选“从函数模块”。弹出的向导会让你填服务名称和包名。服务名我习惯沿用函数模块名后续在 SOAMANAGER 里用 Z* 一把搜出来。认证方式选择“无权限认证”表示这个服务不强制外部系统带 SAP 用户名口令适合内网直连场景。确认生成后系统会在开发包里创建一个服务定义对象保存并激活。右键服务定义再次选择“激活”确认没有红色错误。值得注意不同版本 SE37 菜单位置有差异。SAP GUI 老版本里“创建 Web 服务”就在“实用程序”下新版本可能被收进“更多实用程序”子菜单。找不到就切菜单布局为“整体”模式或者在菜单栏里直接搜“Web 服务”关键字比逐级翻菜单快。包名千万别选 $TMP否则服务定义传不到测试机每个环境都要重做一遍折腾死你。保存时系统还会要求分配一个传输请求ABAP 顾问一般随手挂到已有的开发请求上如果包是第一次建记得先建好包再发布。2.3 激活后怎么拿到 WSDL 地址服务定义激活后回到 SE37 函数模块主界面菜单“Web 服务”里有一个入口能直接浏览该函数对应的 WSDL。浏览器地址栏里那段 URL 就是这一步的交付物一般长这样http://172.16.10.20:8000/sap/bc/srt/wsdl/srvc_ws_0001ZGET_USR02/wsdl11/allinone/ws_policy/document?sap-client800拆开看IP 和端口是 SAP 应用服务器的 HTTP 服务地址端口通常是 8000 或 8002以 SMICM 里看到的 HTTP 监听端口为准。中间 srvc_ws_0001ZGET_USR02 是服务在 ESR 里的技术名。最后的?sap-client800 表示按客户端 800 的委托生成 WSDL如果外部系统实际要调用的是其他客户端请求 URL 上也要带对客户端号否则会出现 403 一类的问题。拿到地址先在浏览器里自己开一遍能正常显示 XML 树说明服务定义和运行时都没问题。打不开就查 SICF 里 /sap/bc/srt 节点状态这个在第 4 章细说。还有一点容易被忽略这里“激活”的只是服务定义真正能被外部调用的 HTTP 端点还没有绑定缺的那一步是 SOAMANAGER 的活别以为服务定义激活就能直接调。3. SOAMANAGER 配置服务端点新旧界面对照与绑定参数3.1 两个配置入口怎么选发布完服务定义SAP 并不会自动暴露 HTTP 端点必须在 SOAMANAGER 里把服务定义绑定到一段 URL 上。这就好比 WSDL 只是接口的“说明书”“端点”才是真正接待外部请求的前台。事务码 SOAMANAGER 打开的是 Web Dynpro 管理页面NetWeaver 7.4 之后一般能看到两个入口“Web 服务配置”和“简化 Web 服务配置”。完整版适合精细控制比如限定传输方式、设置超时、跨服务器绑定。简化版操作路径更短打开直接是搜索框输入 Z* 就能列出当前客户端下所有已激活服务定义。我自己习惯直接把管理页加入浏览器书签地址是http://172.16.10.20:8000/sap/bc/webdynpro/sap/appl_soap_management?sap-client800老版本 NetWeaver 7.0x 到 7.3 这里没有简化版完整版入口也可能藏在树形菜单里界面是旧式表格风格连搜索框都没有。碰到旧系统别慌老老实实从 SAP GUI 打开 SOAMANAGER左树找“Web Service Configuration”节点一样能完成任务。判断版本最简单的方式是看系统状态里的 SAP_BASIS 组件版本比在界面上挨个菜单试快得多。3.2 用 Z* 通配符找到刚发布的服务并创建端点在搜索框输入 ZGET_USR02 或直接输入 Z*搜索结果里能看到服务定义 ZGET_USR02 和它当前的端点数量。点进去后页面展示的是服务定义信息真正要操作的是上方或右侧的“创建服务”按钮进入端点创建向导传输协议HTTP 还是 HTTPS内网对接一般 HTTP 就够跨公网走 HTTPS提前准备服务器证书并用 STRUST 导入。服务路径系统会基于服务名自动生成一段 URL保留默认即可改路径容易让外部系统拿到的 WSDL 和实际调用地址不一致。应用服务器单机环境默认当前应用服务器集群环境会列出可选服务器选哪一台取决于外部系统从哪个 IP 访问。客户端确认服务发布在哪个 Client通常和函数模块所在客户端一致。保存后端点状态会从“未绑定”变成“已激活”页面底部会出现一段可点击的 WSDL 链接。我一般再点一下链接确认浏览器能正常弹出 XML整个发布链路才算闭环。如果保存时报错最常见的是服务路径冲突或包权限不足路径冲突就换一个前缀权限不足找 BASIS 把 S_SERVICE 授权补上。有些环境里“创建服务”按钮是灰的多半是当前用户缺 SOAMANAGER 的角色给角色里加上 S_SERVICE 的显示和执行权限再重登。3.3 怎么判断端点真的通了三个实用验证配好后别急着把地址发出去我习惯验证三处。第一浏览器直接打开 WSDL 地址。无认证的端点应该直接弹 XML 文档如果弹的是登录框说明端点悄悄开了认证回到端点属性检查“已认证用户”选项。第二用命令行模拟一次请求在 Windows 或 Linux 机器上都能干curl -I http://172.16.10.20:8000/sap/bc/srt/wsdl/srvc_ws_0001ZGET_USR02/wsdl11/allinone/ws_policy/document?sap-client800-I 参数只拿响应头不会把整份 XML 拉下来。返回 200 说明网络链路和服务状态正常403 多半是认证或客户端问题404 大概率是 ICF 节点没激活。第三在 SOAMANAGER 的“日志和跟踪”里看有没有针对这个端点的调用记录外部系统报过 500 的话这里会留下堆栈摘要比两边来回转述报错省时省力。这里补一个集群场景的坑如果 SAP 是多应用服务器集群外部系统请求被负载均衡到哪台那台服务器上的端点就必须也激活。有些公司只在一台机器上配了端点另一台没配隔一阵接口就抽风查半天发现是集群分发的问题。这种问题在 SOAMANAGER 表面看不出来要从 SICF 或日志服务器确认实际被请求的实例。4. 发布 WebService 的常见坑认证、本地类型与 ICF 三座山4.1 无权限认证却在端点上开了认证外部一直报 401现象外部系统开发按你给的 WSDL 发起调用直接返回 HTTP 401 Unauthorized报文里连错误详情都没有对方一口咬定 URL 没问题。原因创建服务定义时你选了“无权限认证”但 SOAMANAGER 创建端点时默认的认证方式可能还是“已认证用户”。服务定义和端点两层配置不一致外部请求没带认证信息自然 401。解决在端点属性里把认证方式改成“无”保存后再让外部重测。如果你内部要求必须认证反过来别用无认证模式改 Basic Auth给调用方一个专用 SAP 账号并且确认密码不随便过期——SAP 密码过期会让接口隔三差五挂掉这是无认证之外最常见的稳定性问题。4.2 函数模块用了本地类型生成的 WSDL 字段名对不上现象外部系统拿 WSDL 生成客户端后发现接口数据对不上字段名带一串后缀结构嵌套得也不像人写的。原因函数模块里用了局部定义的 STRUCTURE 或内表类型发布时 SAP 无法映射到 SE11 全局类型会为这些本地类型生成匿名复杂类型并改写字段名。SAP 对本地类型在 WSDL 中的命名有一套内部规则外部工具解析出来全是 ITEM、ST_ITEM 这类通用名根本看不出业务含义。解决发布前把所有导入导出参数类型换成 SE11 里的全局类型或用 USR02-BNAME 这类基础类型的引用形式。表格参数同理优先用 SE11 建好的表类型。这条要在代码审查时就卡住等外部拿到 WSDL 生成完客户端再改服务只能删了重建破坏面很大。4.3 ICF 节点未激活WSDL 地址 404现象服务定义、端点全部激活浏览器打开 WSDL 地址却提示 404 Not FoundSAP 侧一圈人都看傻了。原因SAP WebService 运行时依赖 ICF 服务节点尤其 /sap/bc/srt 这条路径下的子节点如果被 BASIS 停掉或初始安装后没激活WSDL 请求到不了运行时。解决事务码 SICF在节点树里输入 /sap/bc/srt展开查看各级节点状态灰色就是未激活右键“激活服务”。激活后回 SOAMANAGER 重新保存一次端点再刷新 WSDL。注意激活 ICF 节点不需要重启应用服务器SDM 或 ICM 会自动加载也别把整棵 ICF 树都点开接口暴露面越小越安全。4.4 多客户端使用WSDL 请求带错客户端号返回 403现象同一个 WSDL 地址在浏览器手工打开正常外部系统程序调用却返回 403 Forbidden。原因WSDL URL 末尾?sap-client800 指明了客户端外部系统配置调用的客户端和发布客户端不一致目标客户端里没有对应服务权限。解决在 SOAMANAGER 端点配置里把“备用客户端”改成期望的目标客户端并确认那个客户端里服务定义也处于激活状态。多客户端环境我习惯让外部系统把 sap-client 参数写死在配置里不依赖对方系统里的默认值省得哪天换客户端就悄悄失效。4.5 SOAMANAGER 界面找不到“简化 Web 服务配置”现象对着文档操作界面上根本没有“简化 Web 服务配置”入口怀疑自己装的是假 SAP。原因简化配置是 NetWeaver 7.4 之后才加入的7.0x 到 7.3 老版本只有完整版“Web Service Configuration”。解决低版本走完整版入口左树节点叫“Web Service Configuration”。如果连这个都没有检查当前登录用户有没有对应角色授权SOAMANAGER 的访问权限不足时部分菜单会被隐藏。让 BASIS 把用户加到 SAP_SOAMANAGER 或对应 PFCG 角色里比怀疑版本靠谱。还有一个兜底办法直接用事务码 SMICM 检查 HTTP 服务是否正常再配合 SICF 手工访问 WSDL URL能把问题缩小到“界面展示”还是“运行时链路”。5. SAP 反过来当客户端消费外部服务从代理类到逻辑端口5.1 SE80 里创建企业服务并选择消费服务SAP 做客户端去调外部服务的入口在 SE80。先选择一个包比如 Z001右键选择“创建 → 企业服务”系统会弹出向导第一个问题问你要“提供服务”还是“消费服务”。这里选“消费服务”表示 SAP 这次是调用方系统会生成一个代理类把外部系统的操作封装成本地方法。如果选反了后面生成的就是提供者绑定连激活都可能失败。选好包名和生成前缀后向导会让选择 WSDL 来源。外部系统一般给三种形式WSDL URL、WSDL 文件、或者把接口挂在企业服务总线上给你一个服务地址。最省事的是 URL 形式直接把地址填进去SAP 会尝试远程解析。填 URL 时注意别带引号或多余空格我曾经因为复制 URL 时带了换行符解析直接报错排查了十分钟才发现是这种低级问题。网上那些公开的测试 WebService 接口也可以拿来练手只要网络能通跑通代理类链路没问题。5.2 从外部 WSDL 生成并激活代理类向导解析 WSDL 后会列出可生成的端口类型和操作列表勾选需要的操作确认生成。系统会在指定包里创建代理类命名前缀默认是 ZCO_ 或 ZWCO_建议统一维护成 ZWCO_ 前缀一看就知道是 Web 服务消费者代理。生成完的对象状态是“未激活”右键激活前确认 WSDL 中引用的外部 schema 文件都能被 SAP 服务器访问到。常见激活失败场景是外部 WSDL 里嵌套引用了同级的 XSD 文件且用相对路径指向内网地址SAP 服务器访问不了。解决办法是把 WSDL 和所有 XSD 文件下载下来传到 SAP 服务器能访问的共享路径再选择“从本地文件生成”让 SAP 从本地读取。激活成功后SE80 对象列表里会出现代理类及配套的请求、响应结构展开能看到每个操作的 IMPORTING 和 EXPORTING 参数这些参数结构会直接出现在后面的 ABAP 代码里。5.3 在 SOAMANAGER 里创建逻辑端口代理类激活了还不能直接用。调用时 SAP 需要一个“逻辑端口”来告诉运行时往哪里发请求。打开 SOAMANAGER在“消费服务”或“消费者代理”区域搜索代理类名 ZWCO_ZGET_USR02点进详情会看到逻辑端口列表是空的。点击“创建逻辑端口”按下面参数填配置项推荐值说明逻辑端口名ZLP_EXT代码里引用这个名字可按环境区分合法字符有限制访问地址外部服务完整 URL通常是拿到的 WSDL 地址去掉 ?wsdl 之后的部分认证方式无 / 基本认证按外部系统要求基本认证要填用户和密码连接超时3060 秒默认 10 秒太短跨公网高延迟场景基本必挂保存后逻辑端口就挂到了代理类下。注意逻辑端口不随程序传输每个环境都要在 SOAMANAGER 里重新配一次配错环境是联调时的高频翻车点。端口名填写时尽量全用大写字母和数字别带中划线和中文否则 XML 解析那层会给你上一课。5.4 写个测试程序真实验证一次配置完成后最快的验证方式是在 SE38 里写个简单报表直接调代理类REPORT ztest_call_ext_ws. DATA: lo_proxy TYPE REF TO zwco_zget_usr02, ls_req TYPE zget_usr02_request, ls_res TYPE zget_usr02_response. CREATE OBJECT lo_proxy EXPORTING logical_port_name ZLP_EXT. ls_req-bname DEVUSER. TRY. CALL METHOD lo_proxy-get_usr02 EXPORTING input ls_req IMPORTING output ls_res. WRITE: / 返回语言:, ls_res-langu, / 最后登录:, ls_res-ldat. CATCH cx_ai_system_fault INTO DATA(lx_sys). WRITE: / 系统故障:, lx_sys-get_text( ). CATCH cx_ai_application_fault INTO DATA(lx_app). WRITE: / 业务故障:, lx_app-get_text( ). ENDTRY.这段代码里 CREATE OBJECT 是创建代理实例logical_port_name 指定了刚在 SOAMANAGER 里配好的 ZLP_EXT之后 CALL METHOD 完全不用感知远端地址。两个异常类要好好用cx_ai_system_fault 是网络、超时、协议解析这类系统级问题cx_ai_application_fault 是外部系统业务逻辑层面的错误。第一次联调时建议两个都捕获并输出完整 get_text很多时候报错详情就藏在里面比外部系统那边转述的日志还全。6. 代理类调用的两个护身习惯逻辑端口隔离与报文抓取6.1 按环境拆逻辑端口避免生产调测试最坑的一次经历开发机调通后往测试机传程序测试机一运行就报“逻辑端口 ZLP_EXT 不存在”。原因是代理类对象能通过传输请求带走逻辑端口配置却留在 SOAMANAGER 里不随程序走。所以每到一个环境都要在这个环境的 SOAMANAGER 里重新创建一个同名逻辑端口指向对应环境的外部地址。后来我改成按环境命名ZLP_DEV、ZLP_TEST、ZLP_PROD并在程序里用系统 ID 判断选择端口名。这样即使某个环境配错了地址也不会出现测试系统打到生产地址上的事故。配置表里也维护端口名和对应 URL做接口清单时直接导出审计和交接都轻松。SDM 传输后如果目标环境忘了建端口程序启动时会直接抛逻辑端口不存在的异常尽早暴露总比半夜被业务电话叫醒强。6.2 在 SOAMANAGER 里抓 SOAP 报文调不通时SAP 说是外部系统没响应外部系统说是 SAP 没发请求两边谁都不认账。打开 SOAMANAGER进到消费代理详情找到“日志和跟踪”开启跟踪后重新触发一次调用系统会完整记录请求、响应和 HTTP 状态码。这个功能的入口在不同版本里位置略有差异但关键字就是“日志”“跟踪”这两个多翻一层菜单也能找到。有一次外部系统坚持说 SAP 发的请求里多了个空格导致解析失败我在跟踪里看到 SOAPAction 头确实被拼上了多余空格去掉后立即恢复。没有这个跟踪页两边能拉锯一整天。从那以后我每次接到新的外部接口第一件事就是把 SOAMANAGER 里对应的消费代理日志打开联调阶段多留一份现场证据希望这个习惯能帮到你。本文还有配套的精品资源点击获取
返回列表