0% found this document useful (0 votes)
4 views11 pages

Criando uma API REST em ABAP

The document provides a guide for creating a REST API in ABAP by implementing the IF_HTTP_EXTENSION interface. It includes code snippets for handling HTTP requests, processing XML data, and mapping URLs to the created class. The document also outlines steps for activating the service and testing it using the SICF transaction.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views11 pages

Criando uma API REST em ABAP

The document provides a guide for creating a REST API in ABAP by implementing the IF_HTTP_EXTENSION interface. It includes code snippets for handling HTTP requests, processing XML data, and mapping URLs to the created class. The document also outlines steps for activating the service and testing it using the SICF transaction.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

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.

You might also like