通过类似 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。
我正在为客户实施 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。