Appeler en ABAP des APIs internes en passant par un proxy local

Si vous souhaitez appeler en local une de vos APIs à des fins de tests, ou encore pour l’utiliser dans un de vos objets de développement, vous pouvez utiliser un proxy local ( On premise ou Private Cloud seulement ).

Prenons par exemple l’API suivante ( API_OUTBOUND_DELIVERY_SRV ) sur S/4 Hana Private Cloud : https://api.sap.com/api/OP_API_OUTBOUND_DELIVERY_SRV_0002/overview

Nous utiliserons cette API pour mettre à jour une livraison sortante dans SAP.

Développement et appel de l’API

Pour l’appeler dans un développement local on procèdera comme suit :

  • Exposition du service ( ici oData V2 )
  • On vérifie si ETag il y a en regardant dans le projet en SEGW : ici DeliveryVersion (servira plus tard)
  • On écrit enfin le code

1/ Déclaration des variables et création du proxy client

* GET
      DATA: lo_client_proxy  TYPE REF TO /iwbep/if_cp_client_proxy,
            lo_read_request  TYPE REF TO /iwbep/if_cp_request_read_list,
            lo_resource      TYPE REF TO /iwbep/if_cp_resource_entity,
            lo_response      TYPE REF TO /iwbep/if_cp_response_read,
            lo_read_response TYPE REF TO /iwbep/if_cp_response_read_lst,
            ls_entity_key    TYPE cl_api_outbound_del_02_mpc=>ts_a_outbdeliveryheadertype,
            ls_business_data TYPE cl_api_outbound_del_02_mpc=>ts_a_outbdeliveryheadertype.

* Création du Proxy client 
     lo_client_proxy = /iwbep/cl_cp_client_proxy_fact=>create_v2_local_proxy( VALUE #( service_id = 'API_OUTBOUND_DELIVERY_SRV' service_version = '0001' ) ).

2/ Création de la requête GET pour obtenir le ETag

     lo_read_request = lo_client_proxy->create_resource_for_entity_set( 'A_OutbDeliveryHeader' )->create_request_for_read( ).
      lo_read_response = lo_read_request->execute( ).

      ls_entity_key = VALUE #(
              deliverydocument  = iv_deliverynumber ). "Delivery to update

      lo_resource = lo_client_proxy->create_resource_for_entity_set( 'A_OutbDeliveryHeader' )->navigate_with_key( ls_entity_key ).
      " Execute the request and retrieve the business data
      lo_response = lo_resource->create_request_for_read( )->execute( ).
      lo_response->get_business_data( IMPORTING es_business_data = ls_business_data ).

Les données reçues de l’API sont placées dans ls_business_data

3/ Création de la requête PATCH pour modifier le champs DeliveryDocumentBySupplier

      " Navigate to the resource and create a request for the update operation
      DATA: lo_patch_resource TYPE REF TO /iwbep/if_cp_resource_entity,
            lo_patch_request  TYPE REF TO /iwbep/if_cp_request_update,
            ls_patch_data     TYPE cl_api_outbound_del_02_mpc=>ts_a_outbdeliveryheadertype,
            lo_patch_response TYPE REF TO /iwbep/if_cp_response_update.

      lo_patch_resource = lo_client_proxy->create_resource_for_entity_set( 'A_OutbDeliveryHeader' )->navigate_with_key( ls_entity_key ).
      lo_patch_request = lo_patch_resource->create_request_for_update( /iwbep/if_cp_request_update=>gcs_update_semantic-patch ).

      " ETag is needed
      lo_patch_request->set_if_match( CONV string( ls_business_data-deliveryversion ) ).

      ls_patch_data = VALUE #(
      DeliveryDocumentBySupplier  = iv_lifex "External ID to update
      deliverydocument = iv_deliverynumber "In OData V2, it's needed to add also the key in the body request).
      " Execute the request and retrieve the business data
      lo_patch_request->set_business_data( is_business_data = ls_patch_data
      it_provided_property = VALUE #( ( |DELIVERYDOCUMENTBYSUPPLIER| ) ) ).

      lo_patch_response = lo_patch_request->execute( ).

Conclusion

Voici une solution pour appeler des APIs en interne dans un programme ABAP. Via cette méthode il n’y a pas d’entête HTTP précisé dans la requête puisque tout se fait en interne dans le même système SAP.

Cependant, la classe /IWBEP/CL_CP_CLIENT_PROXY_FACT n’est pas disponible sur le cloud (BTP, ABAP environment et S/4 Cloud). En cas de développement dans ces environnements, il vaudra mieux s’orienter vers l’utilisation d’API qui ont été créées en utilisant le framework RAP et ainsi utiliser l’EML pour interagir directement avec le business object, ou utiliser plutôt la classe /IWBEP/CL_CP_FACTORY_REMOTE et donc la création d’un remote proxy.

Pour les tests unitaires, on pourra utiliser en ABAP Cloud la classe /IWBEP/CL_CP_FACTORY_UNIT_TST.