2017-04-12 8 views
0

私はReSTful SICFサービスを顧客に実装しています。 SICFサービスには単一のハンドラ(IF_HTTP_EXTENSION~HANDLE_REQUESTを実装しています)があり、これはさらにAPI処理クラスを呼び出します。 APIハンドリングクラスは、APIが/animals/:id/tiger/:id/animals/4545152/tiger/1423331のように見えますがコールされると、このABAP選択クエリでパターンをどのように一致させるのですか?

DDIC Table: ZAPI_HNLDRS 
    /animals/:id   | ZCL_HANDLE_ANIMALS 
    /animals/:id/tiger/:id | ZCL_HANDLE_TIGER 

のように入ってくるパスに対して保存されています。

ZCL_HANDLE_TIGERを取得するためにZAPI_HNDLRSを呼び出すにはどうすればよいですか?もちろん

、これは、

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

を助けにはなりません私は何らかの形でREGEXを使用する必要が信じている - 私はどのようにかかわらず、必ずamn't。 ABAP選択クエリでパターンをどのように一致させるのですか?私は、全体のプロセスが動的になりたいので

更新

私はAPIハンドラを格納するためのテーブルを持っている理由があります。

このようになる可能性のある一定期間に渡って追加できる新しいURLがある可能性があります。

スプリットを使用していただきありがとうございました しかし、まだ完全に動的ではありません。将来新しいURLが複数出現する可能性があります。例えば。

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

このようなケースが発生

、テーブル ZAPI_HNDLRSで新しいハンドラのエントリが存在します。

したがって、すべての受信リソースパスを変換するための汎用ロジックが必要です。さんが言わせて:それは私が右のハンドラがテーブルからピックアップして知っているように、/animals/:id/tiger/:id/claws を保存されている模様だ/animals/1234243242423/tiger/32423443344/clawsに。

答えて

1

私はこれを1行のコードで行うことは非常に難しいと思います。 SAPヘルプあなたは本当にREGEXを使用する場合は、おそらく正規表現については、この

REPLACE ALL OCCURRENCES OF REGEX '/\d+/' IN lv_input WITH '/: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. 
1

正規表現を使用してURIを分割することはできますが、単純なSPLITで十分であるため、この場合は一番上にあるようです。 URIを別々の部分に分割したら、実際のIDを置き換える ':id'文字列を使用してURIを再度組み立てることができます。必要に応じて、ID部分にいくつかのチェックを追加することもできます。

関連する問題