SAP proporciona múltiples formas de interactuar o comunicarse con sistemas externos utilizando técnicas como OData, RFC, etc. En la era de TI actual, las API son la máxima prioridad al elegir los mecanismos de comunicación. SAP proporciona la clase estándar CL_REST_RESOURCE, que proporciona métodos REST como GET, PUT, POST, DELETE, etc. En este blog, he explicado cómo aceptar JSON de sistemas externos y consumir datos en SAP.
Flujo del proceso:
Vaya a Tcode: SE24 y cree una nueva clase, ZCL_API_TEST. Haga clic en la pestaña de propiedades y agregue la superclase CL_REST_RESOURCE.
Redefina el método POST para obtener datos fuera de SAP.
Fragmento de código:
METHOD if_rest_resource~post.
DATA:lr_data TYPE REF TO data.
FIELD-SYMBOLS:<lt_table> TYPE STANDARD TABLE.
TYPES: BEGIN OF ty_workarea,
name(50),
city(50),
region(20),
pin(6).
TYPES: END OF ty_workarea.
DATA: wa_data TYPE ty_workarea.
DATA(lv_request_body) = mo_request->get_entity( )->get_string_data( ).
/ui2/cl_json=>deserialize(
EXPORTING
json = lv_request_body
CHANGING
data = lr_data
).
ASSIGN lr_data->* TO FIELD-SYMBOL(<ls_data>).
ASSIGN COMPONENT 'TESTAPI' OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lt_table_ref>).
ASSIGN <lt_table_ref>->* TO <lt_table>.
LOOP AT <lt_table> ASSIGNING FIELD-SYMBOL(<ls_line>).
ASSIGN <ls_line>->* TO FIELD-SYMBOL(<ls_line_value>).
ASSIGN COMPONENT 'NAME' OF STRUCTURE <ls_line_value> TO FIELD-SYMBOL(<ld_key>).
IF <ld_key> IS ASSIGNED.
ASSIGN <ld_key>->* TO FIELD-SYMBOL(<ld_key_value>).
wa_data-name = <ld_key_value>.
ENDIF.
ASSIGN COMPONENT 'CITY' OF STRUCTURE <ls_line_value> TO <ld_key>.
IF <ld_key> IS ASSIGNED.
ASSIGN <ld_key>->* TO <ld_key_value>.
wa_data-city = <ld_key_value>.
ENDIF.
ASSIGN COMPONENT 'REGION' OF STRUCTURE <ls_line_value> TO <ld_key>.
IF <ld_key> IS ASSIGNED.
ASSIGN <ld_key>->* TO <ld_key_value>.
wa_data-region = <ld_key_value>.
ENDIF.
ASSIGN COMPONENT 'PIN' OF STRUCTURE <ls_line_value> TO <ld_key>.
IF <ld_key> IS ASSIGNED.
ASSIGN <ld_key>->* TO <ld_key_value>.
wa_data-pin = <ld_key_value>.
ENDIF.
ENDLOOP.
ENDMETHOD.
Cree la clase de controlador REST ZCL_REST_TEST y proporcione el nombre de superclase CL_REST_HTTP_HANDLER. Además, redefina el método GET_ROOT_HANDLER. Esta clase de controlador se utilizará al crear servicios SICF. El objetivo principal de esta clase de controlador es vincular la URL a la clase de recurso REST.
Como se muestra en la instantánea anterior, el nombre de la plantilla es /ZAPI y esta clase de controlador raíz se vinculará a la clase ZCL_API_TEST. En la clase API POST, se llamará al método POST de la clase ZCL_API_TEST.
Fragmento de código:
DATA(lo_router) = NEW cl_rest_router( ).
lo_router->attach( iv_template="/ZAPI" iv_handler_class="ZCL_API_TEST" ).
ro_root_handler = lo_router.
El siguiente paso es crear el servicio SICF. Vaya a tcode SICF -> host predeterminado -> Nuevo subelemento
Ingrese la descripción del servicio, vaya a la pestaña de la lista de controladores y coloque el nombre de la clase como ZCL_REST_TEST.
Regrese y active el servicio.
Creación de URL:
Haga clic derecho en el servicio ZAPI y haga clic en Test Service; obtendrá la URL. Simplemente copie la URL y agregue ZAPI a la ruta existente.
Ejemplo:
URL original:
http://abc.company.com:8001/zapi?sap-client=100
URL modificada:
http://abc.company.com:8001/zapi/ZAPI?sap-client=100
Aquí, ZAPI distingue entre mayúsculas y minúsculas.
Al pasar la validación del token:
Cuando queremos hacer una llamada POST, la generación de token es obligatoria, lo que se logra realizando una llamada GET y luego colocando el token en la llamada POST. Este proceso de validación de token también se puede omitir redefiniendo el método HANDLE_CSRF_TOKEN sin escribir ningún código.
Probando la API usando POSTMAN:
Seleccione la llamada POST e ingrese la URL. Seleccione autenticación básica en la pestaña de autorización e ingrese un nombre de usuario y contraseña. En la parte del cuerpo, seleccione «sin procesar» y cree datos JSON.
En la instantánea anterior, podemos ver que el área de trabajo wa_data contiene todos los datos que se pasan a través de JSON.
Este enfoque es muy eficiente y sencillo para su comprensión e implementación. Este método de implementación de API también supera el inconveniente de OData, que pasa campos separados por espacios en JSON. También es posible la omisión o redefinición de tokens, lo que facilitará el proceso de llamada a la API.
Espero escuchar más sobre la creación de API usando clases estándar de SAP. Siéntase libre de comentar y discutir.
Saludos, gracias por leer, y mantente saludable.
Abhijeet Tikar
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073