通过类似 REST 查询的模式匹配 table 行?

Match table rows by REST query-like patterns?

我正在为客户实施 ReSTful SICF 服务。 SICF 服务有一个单独的处理程序(实现 IF_HTTP_EXTENSION~HANDLE_REQUEST),这进一步调用 API 处理 classes。 API 处理 class 像这样

存储在传入路径中
DDIC Table: ZAPI_HNLDRS
    /animals/:id           | ZCL_HANDLE_ANIMALS
    /animals/:id/tiger/:id | ZCL_HANDLE_TIGER

当调用 API 时 /animals/:id/tiger/:id 看起来像 /animals/4545152/tiger/1423331

如何拨打 ZAPI_HNDLRS 以获得 ZCL_HANDLE_TIGER?

当然,这没有用,

select single HANDLING_CLASS from ZAPI_HNDLRS
  into <wa> where uri = '/animals/4545152/tiger/1423331'

我相信我必须以某种形式使用 REGEX - 我不确定如何使用。如何匹配 ABAP select 查询中的模式?

更新

我有一个 table 来存储 API 处理程序的原因是因为我希望整个过程是动态的。

我们可以在一段时间内添加新的网址,看起来像这样。

感谢使用 SPLIT 的回答 但这仍然不是完全动态的。将来可能会出现多个新网址。例如

/animals/:id/tiger/:id/claws
/animals/:id/tiger/:id/claws/:id
:id - is an unique id

当出现这种情况时,table ZAPI_HNDLRS 中会有新的处理程序条目。

因此,我需要一个通用逻辑来转换任何传入的资源路径。比方说:/animals/1234243242423/tiger/32423443344/claws 存储的模式 /animals/:id/tiger/:id/claws 这样我就知道从 table 中提取正确的处理程序。

您可以使用正则表达式来拆分 URI,但在这种情况下它似乎超出了顶部,因为简单的 SPLIT 就足够了。一旦你将 URI 分成不同的部分,你就可以将它重新组合在一起,用 ':id' 字符串替换实际的 ID。如果需要,您还可以在 ID 部分添加一些检查。

我认为在一行代码中很难做到这一点。 这里有一个演示供您参考:

DATA:
  lv_char_org    TYPE char120 VALUE '/animals/4545152/tiger/1423331',
  lv_char_target TYPE char120,
  lt_char_set    TYPE STANDARD TABLE OF char120.

SPLIT lv_char_org AT '/' INTO TABLE lt_char_set.
DELETE lt_char_set INDEX 1.

LOOP AT lt_char_set INTO DATA(lv_char_set).
  IF sy-tabix MOD 2 EQ 1.
    lv_char_target = lv_char_target && '/' && lv_char_set && '/'.
  ELSE.
    lv_char_target = lv_char_target && 'id:'.
  ENDIF.
ENDLOOP.

WRITE lv_char_target.

如果你真的想使用 REGEX,你可能正在寻找这个

REPLACE ALL OCCURRENCES OF REGEX '/\d+/' IN lv_input WITH '/:id/'

对于正则表达式,请参阅 SAP 帮助:

https://help.sap.com/http.svc/rc/abapdocu_740_index_htm/7.40/en-US/abenregex_syntax_specials.htm

我首先建议在继承自 CL_REST_RESOURCE 的单独 class 中编写 HTTP 处理程序,而不是尝试将所有内容都压缩到 handle_request 中。在那个 class 说 ZCL_API_ANIMALS_TIGER 中,您将重新实现与 HTTP 动词相对应的方法。您的 SICF 节点应继承自 cl_rest_http_handler.

在您的 SICF 节点的方法 if_rest_application~get_root_handler 中,您将以这种方式附加处理程序

lo_router->attach( iv_template = '/animals/{ID}/tiger/{tigerID} '   iv_handler_class = 'ZCL_API_ANIMALS_TIGER' ).

从那里,您可以在执行请求时从来自 mo_request->get_uri_attributes( ) 的 table 中选择 ID 或老虎 ID。