Criando uma API REST
Link: [Link]
Criar uma classe
Implementar a Interface IF_HTTP_EXTENSION
Implementar o codigo no método IF_HTTP_EXTENSION~HANDLE_REQUEST
Implementação Basica
METHOD if_http_extension~handle_request.
DATA: ld_id TYPE string.
DATA: ld_path TYPE string.
DATA: lt_path TYPE STANDARD TABLE OF string.
DATA: ld_params TYPE string.
DATA: ld_remote_addr TYPE string.
DATA: ld_request_body TYPE string.
DATA: ld_method TYPE string.
DATA: lt_header TYPE tihttpnvp.
DATA: ls_header LIKE LINE OF lt_header.
DATA: ld_response_body TYPE string.
" request
ld_request_body = server->request->get_cdata( ).
server->request->get_header_fields(
CHANGING
fields = lt_header
).
READ TABLE lt_header INTO ls_header WITH KEY name = '~request_uri'.
IF sy-subrc = 0.
ld_path = ls_header-value.
ENDIF.
READ TABLE lt_header INTO ls_header WITH KEY name = '~remote_addr'.
IF sy-subrc = 0.
ld_remote_addr = ls_header-value.
ENDIF.
ld_method = server->request->get_method( ).
" response
SPLIT ld_path AT '?' INTO ld_path ld_params.
SPLIT ld_path AT '/' INTO TABLE lt_path.
IF ld_path = '/zapi_drc' AND ld_method = 'POST'.
server->response->set_status(
EXPORTING
code = 201
reason = 'OK'
).
server->response->set_header_field(
EXPORTING
name = 'Content-Type'
value = 'plain/text'
).
ELSEIF ld_path CS '/zapi/cliente' AND ld_method = 'GET'.
READ TABLE lt_path INTO ld_id INDEX 4.
server->response->set_status(
EXPORTING
code = 200
reason = 'OK'
).
server->response->set_header_field(
EXPORTING
name = 'Content-Type'
value = 'application/json'
).
ld_response_body = |\id:1,nome:"José da Silva"\|.
server->response->set_cdata(
EXPORTING
data = ld_response_body
).
ELSE.
server->response->set_status(
EXPORTING
code = 404
reason = 'Page not Found'
).
server->response->set_header_field(
EXPORTING
name = 'Content-Type'
value = 'text/html'
).
ld_response_body = 'Página não encontrada'.
server->response->set_cdata(
EXPORTING
data = ld_response_body
).
ENDIF.
ENDMETHOD.
Mapear um URL para a classe criada
Transação SICF
Criar um novo path
Informar a classe criada
Ativar o serviço
Depois testar o serviço
Codigo para receber um XML
METHOD if_http_extension~handle_request.
TYPES: ty_raw(1024) TYPE x.
DATA: lt_file_data TYPE STANDARD TABLE OF ty_raw.
DATA : lv_file_ram TYPE edoc_file,
lv_file_name TYPE string,
lv_string TYPE string,
lv_length TYPE i,
lv_xml TYPE edoc_br_xml_invoice,
lv_xml_out TYPE edoc_br_xml_invoice.
DATA : ld_id TYPE string,
ld_path TYPE string,
lt_path TYPE STANDARD TABLE OF string,
ld_params TYPE string,
ld_remote_addr TYPE string,
ld_request_body TYPE string,
ld_method TYPE string,
lt_header TYPE tihttpnvp,
ls_header LIKE LINE OF lt_header,
ld_response_body TYPE string,
lt_return TYPE bapirettab.
" request
ld_request_body = server->request->get_cdata( ).
CALL FUNCTION 'ECATT_CONV_STRING_TO_XSTRING'
EXPORTING
im_string = ld_request_body
IMPORTING
ex_xstring = lv_xml.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_xml
IMPORTING
output_length = lv_length
TABLES
binary_tab = lt_file_data.
IF lt_file_data[] IS NOT INITIAL.
CLEAR : lv_xml_out.
LOOP AT lt_file_data INTO DATA(ls_file_data).
lv_xml_out = lv_xml_out && ls_file_data.
ENDLOOP.
CALL FUNCTION 'DP_SPP_XML_XSTRING2STRING'
EXPORTING
inxstring = lv_xml_out
IMPORTING
outstring = lv_string.
ENDIF.
server->request->get_header_fields(
CHANGING
fields = lt_header
).
READ TABLE lt_header INTO ls_header WITH KEY name = '~request_uri'.
IF sy-subrc = 0.
ld_path = ls_header-value.
ENDIF.
READ TABLE lt_header INTO ls_header WITH KEY name = '~remote_addr'.
IF sy-subrc = 0.
ld_remote_addr = ls_header-value.
ENDIF.
ld_method = server->request->get_method( ).
" response
SPLIT ld_path AT '?' INTO ld_path ld_params.
SPLIT ld_path AT '/' INTO TABLE lt_path.
IF ld_path = '/zapi_drc' AND ld_method = 'POST'.
CALL FUNCTION 'EDOC_BR_RECEIVE_XML'
EXPORTING
iv_xml = lv_xml_out
* IV_BUSINESS_MODEL = 'B2B'
* IV_PROCESSING_MANIFESTO_CNPJ =
* IV_IS_PENDING_DOC = ABAP_FALSE
* IV_IS_RETRIEVE = ABAP_FALSE
IMPORTING
et_bapiret2 = lt_return.
" IF lt_return[] IS NOT INITIAL.
server->response->set_status(
EXPORTING
code = 201
reason = 'OK'
).
" ELSE.
" server->response->set_status(
" EXPORTING
" code = 400
" reason = 'OK'
" ).
" ENDIF.
server->response->set_header_field(
EXPORTING
name = 'Content-Type'
value = 'plain/text'
).
ELSE.
server->response->set_status(
EXPORTING
code = 404
reason = 'Page not Found'
).
server->response->set_header_field(
EXPORTING
name = 'Content-Type'
value = 'text/html'
).
ld_response_body = 'Página não encontrada'.
server->response->set_cdata(
EXPORTING
data = ld_response_body
).
ENDIF.
ENDMETHOD.