2017-04-12 1 views
0

Je suis en train de mettre en œuvre les services ReSTful SICF pour un client. Le service SICF a un seul gestionnaire (implémentant IF_HTTP_EXTENSION~HANDLE_REQUEST) et cela appelle d'autres classes de gestion d'API. La classe de traitement de l'API est stockée sur le chemin entrant comme celui-ciComment faire correspondre les modèles dans une requête de sélection ABAP?

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

Lorsque l'API est appelée /animals/:id/tiger/:id ressemble /animals/4545152/tiger/1423331.

Comment puis-je appeler ZAPI_HNDLRS pour obtenir ZCL_HANDLE_TIGER?

Bien sûr, cela ne va pas aider,

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

Je crois que je dois utiliser REGEX sous une forme - j'amn't sûr de savoir comment bien. Comment faire correspondre les modèles dans une requête de sélection ABAP?

mise à jour

La raison pour laquelle j'ai une table pour stocker les gestionnaires d'API est parce que je veux tout le processus soit dynamique.

Nous pourrions avoir de nouvelles URLs qui pourraient être ajoutées sur une période de temps qui pourrait ressembler à ceci.

Merci pour les réponses qui utilisent SPLIT Mais ce n'est pas encore entièrement dynamique. Il pourrait y avoir plusieurs nouvelles URL qui pourraient apparaître dans le futur. Par exemple.

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

Lorsque de tels cas se présentent, il y aura de nouvelles entrées de gestionnaire dans le tableau ZAPI_HNDLRS. Par conséquent, j'aurais besoin d'une logique générique pour convertir n'importe quel chemin de ressource entrant. disons: /animals/1234243242423/tiger/32423443344/claws à son modèle qui est stocké /animals/:id/tiger/:id/claws Alors que je connais le bon gestionnaire pour ramasser de la table.

Répondre

1

Je pense qu'il est très difficile de le faire dans une seule ligne de code. Voici une démo pour votre référence:

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

Vous pouvez utiliser des expressions régulières pour diviser l'URI, mais dans ce cas, il semble être sur le dessus, car un simple SPLIT suffirait. Une fois que vous avez divisé l'URI en ses différentes parties, vous pouvez le réassembler avec les chaînes ': id' remplaçant les ID réels. Si nécessaire, vous pouvez également ajouter des vérifications sur les pièces d'identité.