Сопоставлять строки таблицы по шаблонам, подобным запросам REST?

Я реализую услуги ReSTful SICF для клиента. Служба SICF имеет единственный обработчик (реализующий IF_HTTP_EXTENSION~HANDLE_REQUEST), и он вызывает дополнительные классы обработки API. Класс обработки API сохраняется для входящего пути, подобного этому.

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?

обновить

Причина, по которой у меня есть таблица для хранения обработчиков API, заключается в том, что я хочу, чтобы весь процесс был динамическим.

У нас могли бы быть новые URL-адреса, которые можно было бы добавлять в течение определенного периода времени, которые могли бы выглядеть так.

Спасибо за ответы, в которых используется SPLIT. Но это все еще не полностью динамично. В будущем может появиться несколько новых URL-адресов. Например.

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

При возникновении таких случаев в таблице ZAPI_HNDLRS появятся новые записи обработчика.

Следовательно, мне понадобится общая логика для преобразования любого входящего пути к ресурсу. скажем: /animals/1234243242423/tiger/32423443344/claws к сохраненному шаблону /animals/:id/tiger/:id/claws Так что я знаю правильный обработчик для выбора из таблицы.


person lonelymo    schedule 12.04.2017    source источник


Ответы (3)


Я думаю, что очень сложно сделать это в одной строке кода. Вот демо для справки:

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.
person terence4444    schedule 12.04.2017

Если вы действительно хотите использовать REGEX, вы, вероятно, ищете это

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

Regex см. в справке SAP:

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

person futu    schedule 13.04.2017

Вы можете использовать регулярные выражения для разделения URI, но в этом случае это кажется чрезмерным, потому что простой РАЗДЕЛИТЬ будет достаточно. Как только вы разделите URI на разные части, вы можете снова собрать его вместе, заменив фактические идентификаторы строками ':id'. При необходимости вы также можете добавить некоторые проверки на части идентификатора.

person Gert Beukema    schedule 12.04.2017