
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
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.
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