最近在工作中需要发布 http 接口,以供第三方系统调用,所以有了本博客,用来记录开发过程
网上有很多实现的方式都是通过 IF_HTTP_EXTENSION 接口实现的,这次用的方式不一样。
具体过程如下:
一、代码过程
- 使用SE24创建一个类 ZLOCAL_CL_REST,并且继承超类 CL_REST_HTTP_HANDLER 。
- 重构方法 IF_REST_APPLICATION~GET_ROOT_HANDLER,HANDLE_CSRF_TOKEN,其中HANDLE_CSRF_TOKEN 是用于token验证的,如果不需要token验证则直接重构即可,不需要代码,需要验证的话可以将验证的逻辑写在该方法下。
- 重构的代码,其中/GET/PO 为接口路径,ZLOCAL_CL_GET_PURCHASEORDER 为接口类
- TOKEN 验证,如果需要验证的,可以重构方法:HANDLE_CSRF_TOKEN,在原有的代码逻辑下,使用GET 方法时,在发送请求时登入了 Authentication账号密码即可正确获取token。不需要token则直接重构即可,不需要代码。
- 上述完成后,再次使用SE24 创建一个类,类名为前面的接口类 ZLOCAL_CL_GET_PURCHASEORDER .并且继承超类 CL_REST_RESOURCE。
- 继承后,根据接口的不同调用方式,重构相应的方法
这里使用GET方式进行演示
METHOD if_rest_resource~get.
*CALL METHOD SUPER->IF_REST_RESOURCE~GET
* .
DATA: lv_output_json TYPE string.
DATA: lv_ebeln TYPE ebeln.
DATA: BEGIN OF ls_out,
ebeln TYPE ebeln,
bukrs TYPE bukrs,
bsart TYPE bsart,
aedat TYPE aedat,
ernam TYPE ernam,
lifnr TYPE lifnr,
ekorg TYPE ekorg,
END OF ls_out.
DATA: BEGIN OF ls_output,
code TYPE char3,
clnt TYPE sy-mandt,
status TYPE char10,
content TYPE string,
data LIKE ls_out,
END OF ls_output.
DATA(rt_parameters) = mo_request->get_uri_query_parameters( )." 获取参数 "
LOOP AT rt_parameters ASSIGNING FIELD-SYMBOL(<fs_par>).
TRANSLATE <fs_par>-name TO UPPER CASE.
TRANSLATE <fs_par>-value TO UPPER CASE.
ENDLOOP.
ls_output-clnt = sy-mandt.
READ TABLE rt_parameters INTO DATA(ls_par) WITH KEY name = 'EBELN'.
IF sy-subrc IS INITIAL AND ls_par-value IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_par-value
IMPORTING
output = lv_ebeln.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_out FROM ekko
WHERE ebeln = lv_ebeln.
IF sy-subrc IS INITIAL.
ls_output-data = ls_out.
ls_output-code = cl_rest_status_code=>gc_success_ok.
ls_output-status = 'success'.
ls_output-content = '获取成功'.
ELSE.
ls_output-data = ls_out.
ls_output-code = cl_rest_status_code=>gc_success_ok.
ls_output-status = 'fail'.
ls_output-content = '获取失败'.
ENDIF.
ELSE.
ls_output-data = ls_out.
ls_output-code = cl_rest_status_code=>gc_redirection_permanent.
ls_output-status = 'fail'.
ls_output-content = '参数错误'.
ENDIF.
/ui2/cl_json=>serialize(
EXPORTING
data = ls_output
compress = abap_false
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
RECEIVING
r_json = lv_output_json ).
" 响应内容"
mo_response->create_entity( )->set_string_data( lv_output_json ).
" 响应内容类型 : application/json"
mo_response->create_entity( )->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
" 响应状态 : 非必须"
mo_response->set_status( cl_rest_status_code=>gc_success_ok ).
" 响应说明 : 非必须"
mo_response->set_reason( cl_rest_status_code=>get_reason_phrase( cl_rest_status_code=>gc_success_ok ) ).
ENDMETHOD.
POST方式获取body.
" POST 方式传入参数,JSON"
DATA(lv_input_json) = io_entity->get_string_data(
二、使用SICF配置服务
配置如下,处理器为 ZLOCAL_CL_REST ,即第一次创建的类。
三、Postman 测试
1、正确调用
2、如果路径不正确会提示没有合适的资源。
3、方法没启用,提示不受支持。
四、使用token
- 使用token 需要在 POST 方式调用,先对类ZLOCAL_CL_GET_PURCHASEORDER中的方法IF_REST_RESOURCE~POST 重构,为了测试这里简单重构了。
METHOD if_rest_resource~post.
TYPES:BEGIN OF ts_indata ,
matnr TYPE matnr,
maktx TYPE maktx,
END OF ts_indata.
DATA: ls_data TYPE ts_indata.
TYPES: BEGIN OF ts_outdata,
code TYPE char3.
INCLUDE TYPE ts_indata.
TYPES:
END OF ts_outdata.
DATA: ls_outdata TYPE ts_outdata.
" POST 方式传入参数,JSON"
DATA(lv_input_json) = io_entity->get_string_data( ).
" JSON 转换为内表"
/ui2/cl_json=>deserialize(
EXPORTING
json = lv_input_json
CHANGING
data = ls_data ).
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = ls_data-matnr
IMPORTING
output = ls_data-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
SELECT SINGLE maktx FROM makt INTO ls_data-maktx WHERE matnr = ls_data-matnr.
" 内表转换JSON"
DATA: lv_output_json TYPE string.
MOVE-CORRESPONDING ls_data TO ls_outdata.
ls_outdata-code = cl_rest_status_code=>gc_success_ok .
/ui2/cl_json=>serialize(
EXPORTING
data = ls_outdata
compress = abap_false
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
RECEIVING
r_json = lv_output_json ).
" 响应内容"
mo_response->create_entity( )->set_string_data( lv_output_json ).
" 响应状态 : 非必须"
mo_response->set_status( cl_rest_status_code=>gc_success_ok ).
" 响应说明 : 非必须"
mo_response->set_reason( cl_rest_status_code=>get_reason_phrase( cl_rest_status_code=>gc_success_ok ) ).
ENDMETHOD.
-
对请求添加Basic Authentication账号密码,否则无法获取。
-
使用Postman 获取token
请求的Headers 中添加 x-csrf-token 参数,值为 fetch,即可在响应的 Headers 中取得 token 值。
文章来源:https://www.toymoban.com/news/detail-545285.html -
测试token
1、使用错误的token会提示验证失败
2、正确的token
文章来源地址https://www.toymoban.com/news/detail-545285.html
到了这里,关于【SAP】SAP 发布HTTP接口之完整的Restful 含( 含Token 验证)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!