简介:
Resource Representational State Transfer(REST)
Server和Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本,或者用JPG,WebP传输图片等。
用 HTTP Status Code传递Server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误等
对于资源的具体操作类型,由HTTP动词表示。常用的HTTP动词有下面五个(括号里是对应的SQL命令):
1.GET(SELECT) : 从服务器获取资源(一项或多项)
2.POST(CREATE) : 在服务器新建一个资源
3.PUT(UPDATE) : 在服务器更新资源(客户端提供改变后的完整资源)
4.PATCH(UPDATE) : 在服务器更新资源(客户端提供改变的属性)
5.DELETE(DELETE): 从服务器删除资源。
目录
接口添加 IF_HTTP_EXTENSION(标准的) SERVER Type Ref To IF_HTTP_SERVER
然后添加要处理的方式(post get delete) 内部调用就行
在 IF_HTTP_EXTENSION 添加代码,根据需求(新增/修改(POST) 读取(READ)删除(DELETE)等)判断执行上一步的东西。
POST 新增/修改 SERVER Type Ref To IF_HTTP_SERVER
READ 读取 SERVER Type Ref To IF_HTTP_SERVER
DETELE 删除 参数:SERVER Type Ref To IF_HTTP_SERVER
-
创建一个rest api接口(REST风格的网络接口)
-
事务码:Se24
接口添加 IF_HTTP_EXTENSION(标准的) SERVER Type Ref To IF_HTTP_SERVER
-
然后添加要处理的方式(post get delete) 内部调用就行
-
在 IF_HTTP_EXTENSION 添加代码,根据需求(新增/修改(POST) 读取(READ)删除(DELETE)等)判断执行上一步的东西。
lv_method = server->request->get_header_field( name = '~request_method' )."获取操作方式
源码:
METHOD if_http_extension~handle_request.
DATA lv_method TYPE string.
*&获取请求方式
lv_method = server->request->get_header_field( name = '~request_method' ).
CASE lv_method.
WHEN 'POST'. "新增/修改
me->post( server = server ).
WHEN 'GET'. "读取
me->get( server = server ).
WHEN 'DELETE'."删除
me->delete( server = server ).
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
POST 新增/修改 SERVER Type Ref To IF_HTTP_SERVER
METHOD post.
DATA lt_data TYPE TABLE OF zta_test_date.
"获得转换后数据并输出
DATA cpcodepage TYPE cpcodepage.
DATA(i_json) = server->request->if_http_entity~get_cdata( ).
me->code_change( CHANGING i_json = i_json )."将数据进行去空格和去##
TRY.
CALL METHOD /ui2/cl_json=>deserialize "json转化为内表
EXPORTING
json = i_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING
data = lt_data.
CATCH cx_root.
DATA(mesg) = sy-msgv1 && sy-msgv2 && sy-msgv3 && sy-msgv4.
ENDTRY.
IF mesg IS NOT INITIAL.
server->response->set_status( code = 600 reason = 'NO' ).
server->response->set_content_type( 'APPLICATION/JSON' ).
server->response->set_cdata( data = mesg ).
ELSE.
IF lt_data[] IS NOT INITIAL.
MODIFY zta_test_date FROM TABLE lt_data."新增修改内表
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
server->response->set_status( code = 200 reason = 'OK' ).
server->response->set_content_type( 'APPLICATION/JSON' ).
server->response->set_cdata( data = '成功' ).
ELSE.
server->response->set_status( code = 800 reason = 'NO' ).
server->response->set_content_type( 'APPLICATION/JSON' ).
server->response->set_cdata( data = '失败' ).
ENDIF.
ENDIF.
ENDMETHOD
READ 读取 SERVER Type Ref To IF_HTTP_SERVER
METHOD get.
DATA:e_json TYPE string.
DATA:i_json TYPE string.
DATA:BEGIN OF r_date,
sign(1),
option(2),
low TYPE sy-datum,
hight TYPE sy-datum,
END OF r_date .
DATA t_date LIKE TABLE OF r_date.
DATA:BEGIN OF wa_data,
zdate TYPE datum,
END OF wa_data.
DATA wt_data LIKE TABLE OF wa_data.
DATA:lo_json_ser TYPE REF TO cl_trex_json_serializer,
lo_json_des TYPE REF TO cl_trex_json_deserializer.
i_json = server->request->if_http_entity~get_cdata( ).
me->code_change( CHANGING i_json = i_json ).
*&json 装换为内表
TRY.
CALL METHOD /ui2/cl_json=>deserialize
EXPORTING
json = i_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING
data = wt_data.
CATCH cx_root.
DATA(mesg) = sy-msgv1 && sy-msgv2 && sy-msgv3 && sy-msgv4.
ENDTRY.
"处理查询条件
IF wt_data[] IS NOT INITIAL.
LOOP AT wt_data INTO wa_data.
IF sy-tabix = 1.
r_date-low = wa_data-zdate.
r_date+0(3) = 'IEQ'.
ELSE.
r_date+0(3) = 'IBT'.
r_date-hight = wa_data-zdate.
ENDIF.
ENDLOOP.
APPEND r_date TO t_date.
CLEAR r_date.
ENDIF.
SELECT * FROM zta_test_date INTO TABLE @DATA(lt_data) WHERE zdate IN @t_date.
IF lt_data[] IS INITIAL .
server->response->set_status( code = 200 reason = 'no' ).
server->response->set_content_type( 'application/json' ).
server->response->set_cdata( data = '数据为空' ).
RETURN.
ENDIF.
*将数据转换为json格式
CREATE OBJECT lo_json_ser
EXPORTING
data = lt_data[].
"固定写法
CALL METHOD lo_json_ser->serialize.
CALL METHOD lo_json_ser->get_data
RECEIVING
rval = e_json.
IF e_json IS NOT INITIAL.
server->response->set_status( code = 200 reason = 'no' ).
server->response->set_content_type( 'application/json' ).
server->response->set_cdata( data = e_json ).
ELSE.
server->response->set_status( code = 200 reason = 'no' ).
server->response->set_content_type( 'application/json' ).
server->response->set_cdata( data = '数据为空' ).
ENDIF.
ENDMETHOD.
DETELE 删除 参数:SERVER Type Ref To IF_HTTP_SERVER
METHOD delete.
DATA:cpcodepage TYPE cpcodepage.
DATA lt_data TYPE TABLE OF zta_test_date.
*&获取数据
DATA(i_json) = server->request->if_http_entity~get_cdata( ).
*&优化格式
IF i_json IS NOT INITIAL.
me->code_change( CHANGING i_json = i_json ).
ENDIF.
*&json 转换内表
TRY.
CALL METHOD /ui2/cl_json=>deserialize
EXPORTING
json = i_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING
data = lt_data.
CATCH cx_root.
DATA(mesg) = sy-msgv1 && sy-msgv2 && sy-msgv3 && sy-msgv4.
ENDTRY.
*&删除
IF lt_data[] IS NOT INITIAL.
DELETE zta_test_date FROM TABLE lt_data.
IF sy-subrc = 0.
*&返回状态
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
server->response->set_status( code = 200 reason = 'OK' ).
server->response->set_content_type( 'APPLICATION/JSON' ).
server->response->set_cdata( data = '成功' ).
ELSE.
server->response->set_status( code = 800 reason = 'NO' ).
server->response->set_content_type( 'APPLICATION/JSON' ).
server->response->set_cdata( data = '删除失败' ).
ENDIF.
ELSE.
server->response->set_status( code = 800 reason = 'NO' ).
server->response->set_content_type( 'APPLICATION/JSON' ).
server->response->set_cdata( data = '数据为空' ).
ENDIF.
ENDMETHOD
*转化 入参:中文的话用:code:8400
METHOD code_change.
DATA cpcodepage TYPE cpcodepage.
IF i_json IS NOT INITIAL.
CALL FUNCTION 'NLS_GET_FRONTEND_CP'
EXPORTING
langu = sy-langu
IMPORTING
frontend_codepage = cpcodepage
EXCEPTIONS
illegal_syst_codepage = 1
no_frontend_cp_found = 2
internal_or_db_error = 3
OTHERS = 4.
CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
EXPORTING
intext = i_json
inter_cp = cpcodepage
replacement = 32
IMPORTING
outtext = i_json
EXCEPTIONS
invalid_codepage = 1
codepage_mismatch = 2
internal_error = 3
cannot_convert = 4
fields_not_type_c = 5
OTHERS = 6.
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN i_json WITH space.
CONDENSE i_json NO-GAPS.
TRANSLATE i_json TO UPPER CASE.
ENDIF.
ENDMETHOD.