• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
Twitter Linkedin Instagram
S4PCADEMY_Logo
Twitter Linkedin Instagram
FORMACIÓN SAP

Cómo consumir RESTful Cloud API de SAP con solicitud JSON – MS Dynamics

By s4pcademy 


Requisito de desarrollo

Cambiar de un middleware convencional al consumo directo de una API RESTful en Azure Cloud requiere que diseñe y cree un nuevo programa SAP.

Escenario de negocios

Las facturas de SAP deben enviarse a Microsoft Dynamics AX Cloud para crear facturas locales en AX. Las facturas de SAP deben almacenarse en un almacenamiento provisional en MSDAX antes de convertirse en facturas locales.

Configuraciones técnicas: requisito previo

  1. Obviamente, necesita la URL del punto final de la API
  2. Firewall abierto: agregue el punto final de destino de la API a la lista blanca en su red
  3. Configuración del punto final del certificado de API en Azure en STRUST: nota de SAP Oss 2333326
  4. Clave de API y valor de API (aplicaciones) en Azure: es necesario que se emitan desde el sistema de destino

Cómo obtener un certificado SSL abierto – > Consulte SAP OSS Note 2333326 – Tutorial – “Establecimiento de confianza entre el cliente SSL y el servidor SSL en AS ABAP

desarrollo SAP

Defina una estructura profunda y una tabla interna, el subcampo «elementos» se refiere a un tipo de tabla para elementos

Complete los datos en la tabla interna con datos de encabezado y elementos de línea

Json serialization 

Sencillo que puedes usar /ui2/cl_json=>serializar( ) pero en mi caso, necesito etiquetar los números de documentos con la solicitud json para guardar el registro de devolución. solía /UI2/CL_JSON_SERIALIZER para dar un pequeño ajuste

Definir GR_JSON_SERIALIZER Tipo Ref To /UI2/CL_JSON_SERIALIZER

MÉTODO formato conv_json.

GRATIS gt_str_json. <- tipo de tabla de 'z???_json’
DATOS ls_rv_json TIPO z???_json. <- Número de documento + cadena Json

    FREE gt_str_json.
    DATA ls_rv_json TYPE zvim_s_docid_json.

    LOOP AT gt_str_abap ASSIGNING FIELD-SYMBOL(<fs_l_abap_str>).
      GET REFERENCE OF <fs_l_abap_str> INTO DATA(lref_table).
      DATA(lv_json_str) = gr_json_serializer->/ui2/if_serialize~serialize( lref_table  ).
      CONCATENATE  '{"' 'INVOICES' '"  : '  '['    lv_json_str ']'  '}'  INTO ls_rv_json-json .
      ls_rv_json-docid = <fs_l_abap_str>-docid.
      APPEND ls_rv_json TO gt_str_json.
    ENDLOOP.

Open HTTP client 
    cl_http_client=>create_by_url(
         EXPORTING   url = url_path "Endpoint URL 
         IMPORTING   client = DATA(lr_client)
         EXCEPTIONS  argument_not_found = 1
                     plugin_not_active  = 2
                     internal_error     = 3
                     OTHERS             = 4  ).

Add API key and value into the header of json request 

EXPORTADOR nombre = ‘????clave???’ <- El nombre de la clave API
valor = ‘valor?????’ ). <- El valor de la clave API

* Pass Credential
    lr_client->request->set_header_field(
        EXPORTING name  = apikey_pair-name
                  value = apikey_pair-value ).

Define Json format and method type 'Post' in this case  
* Declare Json format
    lr_client->request->set_content_type( if_rest_media_type=>gc_appl_json ).
*POST
    lr_client->request->set_method( if_http_request=>co_request_method_post ).

Send request
* Send body
    LOOP AT gt_str_json ASSIGNING FIELD-SYMBOL(<fs_l_jsonbody>).
      lr_client->request->set_cdata( <fs_l_jsonbody>-json ).
*
* Send
      lr_client->send(    EXCEPTIONS  http_communication_failure = 1
                                http_invalid_state         = 2
                                http_processing_failed     = 3
                                http_invalid_timeout       = 4
                                OTHERS                     = 5 ).

      lr_client->receive( EXCEPTIONS
                                http_communication_failure = 1
                                http_invalid_state         = 2
                                http_processing_failed     = 3
                                OTHERS                     = 4 ).
      IF sy-subrc <> 0.
        lr_client->get_last_error( IMPORTING code    = DATA(lv_errcode)
                                             message = DATA(lv_errmesg) ).
*       RAISE EXCEPTION TYPE zcx_ax MESSAGE e000 WITH lv_errmesg lv_errcode .
*        ls_bapiret2-message =  |{lv_errmesg}| &&  |{lv_errmesg}|.
        ls_bapiret2-message = lv_errmesg && '  ' && lv_errmesg.
        ls_bapiret2-type="E".
* Build
      ELSE.
        DATA(_rt_from_call) = lr_client->response->get_cdata( ).
*
        update_single_inv( <fs_l_jsonbody>-docid  ).
        ls_bapiret2-message = _rt_from_call.
        ls_bapiret2-type="S".
      ENDIF.
      ls_bapiret2-message_v1 = <fs_l_jsonbody>-docid.
      APPEND ls_bapiret2 TO rt_messages.
      CLEAR  ls_bapiret2.
    ENDLOOP.

You can close HTTP client  CL_HTTP_CLIENT->CLOSE( ).  now 



body of Json request that used in the above code   

{
    "INVOICES": [
        {
            "DOCID": "00000?????",
            "ITEM_COUNT": "00002",
            "BUKRS": "7??",
            "XBLNR": "T??????9",
            "BLDAT": "????-??-??",
            "LIFNR": "0000?????",
            "CREDIT_MEMO": " ",
            "EBELN": null,
            "BKTXT": null,
            "SGTXT_HEADER": null,
            "GROSS_AMOUNT": 1100.00,
            "VAT_AMOUNT": 100.00,
            "DATE_CREATED": "????-??-??",
            "ITEMS": [
                {
                    "ITEMID": "00001",
                    "KOSTL": "000070?????",
                    "HKONT": "00000?????",
                    "PRCTR": null,
                    "SGTXT_ITEM": "LINE 1",
                    "MWSKZ": "P1",
                    "SHKZG": "S",
                    "WRBTR": 550.00,
                    "ZUONR": null
                },
                {
                    "ITEMID": "00002",
                    "KOSTL": "00007????",
                    "HKONT": "00000?????",
                    "PRCTR": null,
                    "SGTXT_ITEM": "LINE 2",
                    "MWSKZ": "P1",
                    "SHKZG": "S",
                    "WRBTR": 550.00,
                    "ZUONR": null
                }
            ]
        } 
    ]
}

Prueba de unidad

Nube MS Dynamics AX

Conclusión

Es una lógica bastante simple y concisa, como puede ver, y no se requieren muchos esfuerzos para construir el código ABAP para la interfaz Json. No hay duda de que muchos métodos útiles en la clase ABAP CL_HTTP_CLIENT & /ui2/cl_json ayudará a que sus códigos sean un patrón más simple y autoexplicativo.




SAP S/4HANA Cloud 2302 亮点前瞻
Previo
Manera fácil de crear API en SAP usando clases estándar
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.