导语:最近要做HTTP的接口,简单的看了一下,分享一下接口实现过程,常用的接口方法分为GET、POST。一般来说GET用作读取,POST用作数据交互。
一、创建测试表
这里先创建一个测试表,进行数据的读取和存储。
二、创建类
SE24创建一个类,在Class中添加标准的接口【IF_HTTP_EXTENSION】,接口添加后会自动生成一个方法【IF_HTTP_EXTENSION~HANDLE_REQUEST】,为了代码的可阅读性和模块化,具体的实现代码我们放在自建的GET、POST方法中。
代码:IF_HTTP_EXTENSION~HANDLE_REQUEST
METHOD if_http_extension~handle_request.
DATA : lv_method TYPE string.
lv_method = server->request->get_header_field( '~request_method' ).
CASE lv_method.
WHEN 'GET'.
me->get( server = server ).
WHEN 'POST'.
me->post( server = server ).
WHEN OTHERS.
server->response->set_header_field( name = 'Content-Type' value = 'text/html' ).
server->response->set_cdata( '仅可以使用POST/GET方法进行调用' ).
server->response->set_status( code = 200
reason = '' ).
RETURN.
ENDCASE.
ENDMETHOD.
代码:GET
METHOD get.
DATA: lt_fields TYPE tihttpnvp,
lv_werks TYPE werks_d,
lv_content_type TYPE string,
lv_req_json TYPE string,
lv_res_json TYPE string.
DATA :r_matnr TYPE RANGE OF mara-matnr.
lv_req_json = server->request->get_cdata( ).
DATA : lt_input TYPE TABLE OF zthttp_test.
DATA : ls_output TYPE zthttp_test.
DATA : BEGIN OF ls_error,
return TYPE return,
message TYPE char40,
END OF ls_error.
lv_req_json = server->request->get_cdata( ).
/ui2/cl_json=>deserialize( EXPORTING json = lv_req_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING data = lt_input ).
LOOP AT lt_input INTO DATA(ls_input).
APPEND VALUE #( sign = 'I' option = 'EQ' low = ls_input-matnr ) TO r_matnr.
ENDLOOP.
server->request->get_form_fields( CHANGING fields = lt_fields ).
IF lt_fields IS INITIAL.
" Sets current HTTP status code
server->response->set_status( code = 404 reason = '未查询到传入参数,请检查' ).
RETURN.
ENDIF.
LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<fs>).
TRANSLATE <fs>-name TO UPPER CASE.
CASE <fs>-name.
WHEN 'WERKS'.
lv_werks = <fs>-value.
ENDCASE.
ENDLOOP.
"读取数据
SELECT * FROM zthttp_test
INTO TABLE @DATA(lt_zthttp_test)
WHERE werks = @lv_werks
AND matnr IN @r_matnr.
IF lt_zthttp_test IS NOT INITIAL.
"出参转换为json格式
lv_res_json = /ui2/cl_json=>serialize( data = lt_zthttp_test ).
server->response->set_status( code = 200 reason = 'successfully' ). "
server->response->set_header_field( name = 'Content-Type' value = 'application/json' ).
server->response->set_cdata( lv_res_json ).
ELSE.
ls_error-return = 'E'.
ls_error-message = '无符合条件数据'.
lv_res_json = /ui2/cl_json=>serialize( data = ls_error ).
server->response->set_status( code = 200 reason = 'successfully' ). "
server->response->set_header_field( name = 'Content-Type' value = 'application/json' ).
server->response->set_cdata( lv_res_json ).
ENDIF.
ENDMETHOD.
代码:POST
METHOD post.
DATA : lv_req_json TYPE string,
lv_res_json TYPE string.
DATA : ls_input TYPE zthttp_test.
DATA : lt_input TYPE TABLE OF zthttp_test.
DATA : BEGIN OF ls_output,
return TYPE return,
message TYPE char40,
END OF ls_output.
lv_req_json = server->request->get_cdata( ).
IF lv_req_json IS INITIAL.
ls_output-return = 'E'.
ls_output-message = '请输入参数!'.
lv_res_json = /ui2/cl_json=>serialize( data = ls_output ).
server->response->set_status( code = 404 reason = '未查询到传入参数,请检查' ).
server->response->set_header_field( name = 'Content-Type' value = 'application/json' ).
server->response->set_cdata( lv_res_json ).
RETURN.
ENDIF.
/ui2/cl_json=>deserialize( EXPORTING json = lv_req_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING data = lt_input ).
MODIFY zthttp_test FROM TABLE lt_input.
COMMIT WORK.
IF sy-subrc = 0.
ls_output-return = 'S'.
ls_output-message = '创建成功!'.
ELSE.
ls_output-return = 'S'.
ls_output-message = '创建失败!'.
ENDIF.
"出参转换为json格式
lv_res_json = /ui2/cl_json=>serialize( data = ls_output ).
server->response->set_status( code = 200 reason = 'successfully' ). "
server->response->set_header_field( name = 'Content-Type' value = 'application/json' ).
server->response->set_cdata( lv_res_json ).
ENDMETHOD.
三、创建服务
1、在SICF中新建一个服务,用于HTTP接口使用
创建过程如下图展示。
建议路径:sap->bc->rest->API
2、将Class放入处理器清单中
按理说最好在abap_http中再定义一层服务来存放所有的http接口,这里为了测试方便没有这样做。
四、测试
1、POST测试
我们根据测试服务所提供的地址,把地址放进POSTMAN进行测试,先测试POST的写入。
2、GET测试
成功写入后,进行GET查询
作者:小飞猪猪猪猪猪猪猪–CSDN