news 2026/6/10 17:54:33

IF_REST_APPLICATION原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IF_REST_APPLICATION原理

IF_REST_APPLICATION原理

IF_REST_APPLICATION实现路径匹配的核心原理是:你预先定义一套“路由规则”(即 URI 模板与后端 ABAP 处理类的绑定关系),当客户端请求到来时,SAP REST 框架中的“路由器”CL_REST_ROUTER会找出匹配度最高的那条规则,自动创建对应的处理类实例,然后由其处理该请求

下面,我们来完整地拆解一下这个过程中的关键环节。

🚀 启动:从 ICF 到 REST 应用

整个流程始于 SAP 互联网通信框架 (ICF)。当客户端发送 HTTP 请求,例如http://<server>/sap/bc/rest_cars/Cars/47时,ICF 的请求会被你预先注册的 REST 处理类(通常继承自CL_REST_HTTP_HANDLER)捕获。

这个通用的处理类会接管后续流程,调用你需要实现的IF_REST_APPLICATION~GET_ROOT_HANDLER方法,来获取整个 REST 应用的根路由器对象。这一步标志着从 ICF 的 http 层正式切入了专门的 REST 处理框架。

🗺️ 定义:注册 URI 模板与后端类

接下来,你需要在一个继承自CL_REST_HTTP_HANDLER的子类中实现IF_REST_APPLICATION~GET_ROOT_HANDLER方法,在其中完成最核心的路径匹配规则定义

METHOD if_rest_application~get_root_handler. DATA(lo_router) = NEW cl_rest_router( ). " 注册路径模板 '/Cars' 到后端类 'CL_REST_SAMPLE_CARS' lo_router->attach( iv_template = '/Cars' iv_handler_class = 'CL_REST_SAMPLE_CARS' ). " 注册带参数和正则表达式的模板 lo_router->attach( iv_template = '/Car/{ID:[1-9][0-9]*}' iv_handler_class = 'CL_REST_SAMPLE_CAR' ). ro_root_handler = lo_router. ENDMETHOD.

上面这段代码的逻辑在于:

  1. 创建路由器:首先创建一个CL_REST_ROUTER对象,它是整个路径匹配的执行中枢。
  2. 绑定:通过反复调用ATTACH方法,将URI 模板IV_TEMPLATE)和后端 ABAP 处理类名IV_HANDLER_CLASS)紧密绑定起来。

🎯 匹配:路径如何找到后端类

CL_REST_ROUTER的工作就是根据请求的 URI 找到正确的处理器。SAP REST 库支持三种由简单到复杂的 URI 模板类型:

  • 静态模板 (Static Templates):这是最直接的匹配方式。只有当请求的路径与模板字符串完全一致时才会被匹配。

    • 代码示例lo_router->attach( iv_template = '/Cars' ... )
    • 匹配路径:仅匹配.../Cars
  • 带属性的模板 (With URI Attribute):使用{属性名}作为占位符,匹配该位置上的任意内容。

    • 代码示例lo_router->attach( iv_template = '/Cars_history/{MANUFACTURER}' ... )
    • 匹配路径:可以匹配.../Cars_history/ferrari,也可以匹配.../Cars_history/maserati
  • 带正则表达式的模板 (With URI Regular Expression Attribute):这是功能最强的模式,允许用ABAP 正则表达式来精确控制匹配范围和格式。

    • 代码示例lo_router->attach( iv_template = '/Car/{ID:[1-9][0-9]*}' ... )
    • 匹配路径:可以匹配.../Car/1,也可以匹配.../Car/47,但由于正则[1-9][0-9]*的限制,.../Car/0将无法匹配。
处理路径冲突

为了避免冲突,CL_REST_ROUTER会使用一个高效的排序算法来决定最终使用哪个处理类。该算法会优先选择**“文字字符”**(不是用{}包裹的变量部分)最多的模板。

例如,对于一个请求cars/1/color

  • 模板A/cars/{ID}/color
  • 模板B/cars/{ID}/{TYRE}

匹配算法会计算每个模板的精确文字字符数

  • 模板A包含文字/cars//color,共6个(c a r s /c o l o r)。
  • 模板B包含文字/cars/,共1个。

计算得出模板A 胜出,因为它能更精确地描述这个请求。这确保了最相关的后端类会被优先调用。

💡 执行:实例化与处理

CL_REST_ROUTER找到最佳匹配的模板后,框架会动态创建一个该后端处理类(iv_handler_class)的新实例

  • 请求分发:路由器会调用这个处理类实例的HANDLE方法,并将 REST 请求对象IO_REQUEST和响应对象IO_RESPONSE作为参数传入。
  • 资源处理:最后,后端处理类(如CL_REST_RESOURCE的子类)中的对应方法(如GETPOST)被执行,生成响应内容。

📈 交互流程总结

整个流程可以概括为下图所示的交互流程:

后端处理类应用类(IF_REST_APPLICATION)路由器(CL_REST_ROUTER)ICF框架REST 客户端后端处理类应用类(IF_REST_APPLICATION)路由器(CL_REST_ROUTER)ICF框架REST 客户端路由器存储了URI模板 ->> 后端类的映射关系1. HTTP请求 (e.g., GET /sap/bc/rest_cars/Cars/47)2. 调用 GET_ROOT_HANDLER()在方法内部构建并返回 CL_REST_ROUTER实例3. 返回配置好的路由器实例 (ro_root_handler)4. 将请求路由信息发送给路由器,执行匹配5. 解析请求路径,与内部模板进行匹配6. 找到匹配的模板 & 后端类7. 动态创建后端类的实例8. 返回处理结果9. 返回响应数据10. HTTP响应

最后,你可以在后端处理类(如CL_REST_SAMPLE_CAR)的内部,通过GET_URI_ATTRIBUTE('ID')这样的方法来提取 URL 路径中的{ID}参数值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:47:13

什么是 AI 算能基础设施?企业如何选型

AI 算能基础设施&#xff08;AI Compute Infrastructure&#xff09;是企业开展大模型训练、推理服务与智能化应用落地的底座&#xff0c;涵盖算力、网络、存储与平台软件四层能力。与通用云计算不同&#xff0c;算能基础设施更强调高吞吐、低时延与可扩展的 GPU 资源调度。 核…

作者头像 李华
网站建设 2026/6/10 17:46:06

高阻抗风道散热突围:3步解决通信设备热失效与成本失控问题

一、 边缘困境&#xff1a;当“散热”成为吞金兽在通信基建领域&#xff0c;设备稳定性是生命线。然而&#xff0c;许多设备制造商正面临一个隐蔽的系统性风险&#xff1a;高密度部署带来的热管理失控。本文分析的案例来自某通信设备制造商&#xff0c;其生产线上大量基站设备因…

作者头像 李华
网站建设 2026/6/10 17:43:30

【STM32入门】一文搞懂串口通信:波特率、数据位与停止位详解

【STM32入门】一文搞懂串口通信&#xff1a;波特率、数据位与停止位详解前言 在嵌入式开发中&#xff0c;串口&#xff08;UART&#xff09;是最常用、最基础的调试和通信接口。很多新手在使用 STM32 进行串口通信时&#xff0c;经常会遇到乱码、丢包或者无法接收数据的问题。这…

作者头像 李华
网站建设 2026/6/10 17:43:16

金蝶云星空单据字段自动携带实战:配置 vs 插件两种方案对比(附完整代码)

同一个"字段自动携带"需求,能用配置就别写插件。本文用「明细项目按行携带到付款计划」真实场景,讲清两种实现的选型边界和完整落地,附可直接复用的 IronPython 脚本。 目录 前言 一、需求场景 二、方案选型:配置优先,插件兜底 三、方案 A:基础资料预设携带(零…

作者头像 李华
网站建设 2026/6/10 17:41:22

linux磁盘挂载

检查# 1. 查看磁盘总大小和分区布局 sudo fdisk -l /dev/vda | grep -E "Disk /dev/vda|/dev/vda[0-9]"# 2. 查看 LVM 卷组状态 sudo vgs# 3. 查看根分区使用情况和文件系统类型 df -Th /# 4. 查看所有块设备&#xff08;确认是否有 vdb 等其他磁盘&#xff09; lsbl…

作者头像 李华