Api Rest
Api Rest
-- ATRIBUTOS --
HTTP_CLIENT Static Attribute Private Type Ref To IF_HTTP_CLIENT
HTTP Client Abstraction
WA_PARAMETER Static Attribute Private Type
ZESD_KEYVALUES Estructura Clave Valor para las consultas API REST
CODE_RESPONSE Static Attribute Public Type I
Codigo de respuesta HTTP
REASON_RESPONSE Static Attribute Public Type STRING
Razon de respuesta HTTP
BASE_URL Static Attribute Private Type STRING
Url base utilizada para las consultas
-- METODOS --
ADD_PARAMETER_URL Static Method Private
Generar URL para metodos GET
CLASS_CONSTRUCTOR Static Method Public Constructor STATICO
CONVERTIR_FECHA Static Method Public
Convertir STRING a fecha
CONVERTIR_HORA Static Method Public
Convertir STRING a hora
DATA_TO_JSON Static Method Private
Conversión de tabla interna a JSON
GET Static Method Private
Obtener data de una API REST mediante GET
GET_JSON_INPUT Static Method Private
Obtener data de una API REST mediante GET con input JSON
JSON_TO_DATA Static Method Private
Conversión de JSON a tabla interna
POST Static Method Private
Obtener data de una API REST mediante POST
POST_JSON_INPUT Static Method Private
Obtener data de una API REST mediante POST con input JSON
PUT Static Method Private
Obtener data de una API REST mediante PUT
METHOD put.
" @78\QImporting@ URL TYPE STRING URL de solicitud
" @78\QImporting@ TOKEN TYPE STRING Token de Autorización
" @78\QImporting@ PARAMETERS TYPE ZTTSD_KEYVALUES OPTIONAL Tipo tabla Clave Valor
para las consultas API REST
" @7A\QChanging@ RESPONSE TYPE STRING Respuesta a la petición
IF sy-subrc EQ 0.
CALL METHOD http_client->response->get_status
IMPORTING
code = code_response
reason = reason_response.
response = http_client->response->get_cdata( ).
ELSE.
code_response = -1.
ENDIF.
ENDMETHOD.
METHOD post_json_input.
" @78\QImporting@ URL TYPE STRING Url de la API a consultar
" @78\QImporting@ TOKEN TYPE STRING
" @78\QImporting@ JSON TYPE STRING Input JSON para la petición
" @7A\QChanging@ RESPONSE TYPE STRING Respuesta
IF sy-subrc EQ 0.
CALL METHOD http_client->response->get_status
IMPORTING
code = code_response
reason = reason_response.
response = http_client->response->get_cdata( ).
ELSE.
code_response = -1.
ENDIF.
ENDMETHOD.
METHOD post.
" @78\QImporting@ URL TYPE STRING Url de petición
" @78\QImporting@ PARAMETERS TYPE ZTTSD_KEYVALUES OPTIONAL Tipo tabla Clave Valor
para las consultas API REST
" @78\QImporting@ TOKEN TYPE STRING OPTIONAL Token de autorización
" @7A\QChanging@ RESPONSE TYPE STRING Respuesta de petición
IF sy-subrc EQ 0.
CALL METHOD http_client->response->get_status
IMPORTING
code = code_response
reason = reason_response.
response = http_client->response->get_cdata( ).
ELSE.
code_response = -1.
ENDIF.
ENDMETHOD.
METHOD json_to_data.
CHECK: json IS NOT INITIAL.
" @78\QImporting@ JSON TYPE STRING String en JSON a convertir en tabla interna
" @7A\QChanging@ DATA TYPE ANY Tabla interna del string JSON
METHOD get_json_input.
" @78\QImporting@ URL TYPE STRING Url de la API a consultar
" @78\QImporting@ TOKEN TYPE STRING
" @78\QImporting@ JSON TYPE STRING Input JSON para la petición
" @7A\QChanging@ RESPONSE TYPE STRING Respuesta
IF sy-subrc EQ 0.
CALL METHOD http_client->response->get_status
IMPORTING
code = code_response
reason = reason_response.
response = http_client->response->get_cdata( ).
ELSE.
code_response = -1.
ENDIF.
ENDMETHOD.
METHOD get.
" @78\QImporting@ URL TYPE STRING Url de la API a consultar
" @78\QImporting@ TOKEN TYPE STRING
" @7A\QChanging@ RESPONSE TYPE STRING Respuesta
response = http_client->response->get_cdata( ).
ELSE.
code_response = -1.
ENDIF.
ENDMETHOD.
METHOD data_to_json.
" @78\QImporting@ DATA TYPE ANY Tabla interna a convertir a JSON
" @7B\QReturning@ VALUE( JSON ) TYPE STRING String en JSON de la tabla interna
CASE lr_desc->type_kind.
WHEN cl_abap_typedescr=>typekind_struct1 OR
cl_abap_typedescr=>typekind_struct2.
json = '{'.
*Use RTTI to discover structure members and process them individually
lr_sdes ?= lr_desc.
lt_comp = lr_sdes->get_components( ).
LOOP AT lt_comp INTO ls_comp.
ASSIGN COMPONENT ls_comp-name OF STRUCTURE data
TO <field>.
IF sy-subrc = 0 AND <field> IS NOT INITIAL.
*For consecutive elements, add a comma separator after the previous value
IF lv_passed1st = 'X'.
CONCATENATE json ',' INTO json.
ENDIF.
lv_json = data_to_json( data = <field> ).
" { INSERT Everis
" VALOR
CASE lv_json.
WHEN '"true"'.
lv_json = 'true'.
WHEN '"false"'.
lv_json = 'false'.
ENDCASE.
" CLAVE
TRANSLATE: ls_comp-name TO LOWER CASE.
CASE ls_comp-name.
WHEN 'measurementpoints'.
CONCATENATE json ' "' 'measurementPoints' '": ' lv_json INTO json.
WHEN 'measurementpointattributes'.
CONCATENATE json ' "' 'measurementPointAttributes' '": ' lv_json INTO
json.
WHEN 'measurementpointattributekeyid'.
CONCATENATE json ' "' 'measurementPointAttributeKeyId' '": ' lv_json
INTO json.
WHEN 'measurementpointcategory'.
CONCATENATE json ' "' 'measurementPointCategory' '": ' lv_json INTO
json.
WHEN 'measurementpointtypeid'.
CONCATENATE json ' "' 'measurementPointTypeId' '": ' lv_json INTO
json.
WHEN 'customerid'.
CONCATENATE json ' "' 'customerId' '": ' lv_json INTO json.
WHEN 'timezoneid'.
CONCATENATE json ' "' 'timeZoneId' '": ' lv_json INTO json.
WHEN 'createfieldoperation'.
CONCATENATE json ' "' 'createFieldOperation' '": ' lv_json INTO json.
WHEN 'createmeasurementpoint'.
CONCATENATE json ' "' 'createMeasurementPoint' '": ' lv_json INTO
json.
WHEN 'publicid'.
CONCATENATE json ' "' 'publicId' '": ' lv_json INTO json.
WHEN 'siteid'.
CONCATENATE json ' "' 'siteId' '": ' lv_json INTO json.
WHEN 'measurementpointid'.
CONCATENATE json ' "' 'measurementPointId' '": ' lv_json INTO json.
WHEN 'externalreference'.
CONCATENATE json ' "' 'externalReference' '": ' lv_json INTO json.
WHEN OTHERS.
CONCATENATE json ' "' ls_comp-name '": ' lv_json INTO json. " DELETE
EVERIS
ENDCASE.
TRANSLATE: ls_comp-name TO UPPER CASE.
" } INSERT Everis
lv_passed1st = 'X'.
ENDIF.
ENDLOOP.
CONCATENATE json '}' INTO json.
WHEN cl_abap_typedescr=>typekind_table.
DATA: ld_line TYPE REF TO data.
FIELD-SYMBOLS: <tab> TYPE ANY TABLE.
FIELD-SYMBOLS: <line> TYPE ANY.
ASSIGN data TO <tab>.
CREATE DATA ld_line LIKE LINE OF <tab>.
ASSIGN ld_line->* TO <line>.
*Open array for table entries
json = '['.
LOOP AT <tab> INTO <line>.
lv_json = data_to_json( data = <line> ).
CONCATENATE json lv_json INTO json SEPARATED BY space.
AT LAST.
CONTINUE.
ENDAT.
*Separate consecutive values by commas
CONCATENATE json ',' INTO json.
ENDLOOP.
*Close array for table entries
CONCATENATE json ']' INTO json SEPARATED BY space.
WHEN cl_abap_typedescr=>typekind_dref.
*For data references, dereference the data and call method again
FIELD-SYMBOLS: <data> TYPE ANY.
ASSIGN data->* TO <data>.
IF sy-subrc = 0.
json = data_to_json( data = <data> ).
ELSE.
json = '{}'. "Will produce empty JS object
ENDIF.
WHEN OTHERS.
*For elementary types, we merely return a text representation of the value
json = data.
CONDENSE json.
*Escape special characters
REPLACE ALL OCCURRENCES OF '\' IN json
WITH '\\'.
REPLACE ALL OCCURRENCES OF '"' IN json
WITH '\"'.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN json
WITH '\n'.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN json
WITH '\t'.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>form_feed IN json
WITH '\f'.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>vertical_tab IN json
WITH '\v'.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>backspace IN json
WITH '\b'.
*Numeric values do not need to be escaped
IF lr_desc->type_kind NE cl_abap_typedescr=>typekind_num AND
lr_desc->type_kind NE cl_abap_typedescr=>typekind_packed AND
lr_desc->type_kind NE cl_abap_typedescr=>typekind_float AND
lr_desc->type_kind NE cl_abap_typedescr=>typekind_int AND
lr_desc->type_kind NE cl_abap_typedescr=>typekind_int1 AND
lr_desc->type_kind NE cl_abap_typedescr=>typekind_int2.
CONCATENATE '"' json '"' INTO json.
ENDIF.
ENDCASE.
ENDMETHOD.
METHOD convertir_hora.
" @78\QImporting@ CADENA TYPE STRING Cadena a convertir en hora
" @7B\QReturning@ VALUE( HORA ) TYPE STRING Hora convertida
CLEAR: hora.
CONCATENATE: cadena+11(2) cadena+14(2) cadena+17(2) INTO hora.
ENDMETHOD.
METHOD convertir_fecha.
" @78\QImporting@ CADENA TYPE STRING Cadena a convertir
" @7B\QReturning@ VALUE( FECHA ) TYPE STRING Cadena convertida
CLEAR: fecha.
CONCATENATE: cadena+0(4) cadena+5(2) cadena+8(2) INTO fecha.
ENDMETHOD.
METHOD add_parameter_url.
" @78\QImporting@ PARAMETER TYPE STRING
" @78\QImporting@ VALUE TYPE STRING
" @7A\QChanging@ URL TYPE STRING
ENDMETHOD.
METHOD class_constructor.
DATA: lwa_constantes TYPE zesd_const_telemetria.
DATA: ls_json TYPE string.
DATA: ls_string TYPE string.
DATA: ldt_parameters TYPE STANDARD TABLE OF zesd_keyvalues.
DATA: lwa_parameter TYPE zesd_keyvalues.
CLEAR: lwa_parameter.
CLEAR: base_url.
REFRESH: ldt_parameters.
READ TABLE it_constantes INTO lwa_constantes WITH KEY campo = 'URL_BASE' valor1 =
sy-sysid.
MOVE: lwa_constantes-valor2 TO base_url.