最近遇到个牛逼的业务顾问,需求提的比用户直述还烂一万倍,所以空闲时间就多点。闲着也是闲着,来干点好玩的事。
API接口平台设计:(全JSON格式)
做ABAP的都知道,一般接口的处理都是封装个函数来单独处理。那么这些函数能不能做成配置呢?又以什么形式的参数来传入传出呢?
ps:到目前为止,只是有点想法,所以现在以及后面的文章可能都是临时起意的,不好的地方看看就好,好的地方。。。你也不用给钱。
前面设计了用户验证的API,后来试了token,好像不行。所以要么以后要么就是接口验证,要么就是登陆验证。
下面说说设计想法:(思路初版,后续可能有更新的部分)
1.设置接口参数对应函数配置表:
2.在统御API中,获取URL参数,BODY参数,HEADER参数等,匹配1中的配置表
3.动态调用2中对应的函数,并处理返回参数。
好,开始干。。。
一,创建配置表,配置接口对应处理的函数:
二,创建实施类:沿用前面的ZCRM_REST类,修改处理方法。
METHOD if_http_extension~handle_request. TYPES:BEGIN OF ty_retu, success TYPE string, access_token TYPE string, message TYPE string, END OF ty_retu. DATA: lt_fields TYPE tihttpnvp, lv_data TYPE string, lv_retu TYPE string, gw_retu TYPE ty_retu, lv_ifid TYPE string, lv_method TYPE string, gw_api TYPE zapi_control. FIELD-SYMBOLS: <fs_field> LIKE LINE OF lt_fields. lv_ifid = server->request->get_form_field( name = 'IFID' )."GET INTERFACE ID lv_method = server->request->get_header_field( name = '~request_method' )."GET INTERFACE METHOD "CHECK CONTROL TABLE SELECT SINGLE * INTO gw_api FROM zapi_control WHERE zif_id = lv_ifid AND zmethod = lv_method. IF sy-subrc <> 0. gw_retu-success = 'E'. gw_retu-message = 'Called Error,Please check the url or method!'. lv_retu = /ui2/cl_json=>serialize( data = gw_retu pretty_name = 'L' compress = abap_true ). ELSE. CASE gw_api-zflag."used flag WHEN 'X'. *""GET HTTP MESSAGE BODY lv_data = server->request->if_http_entity~get_cdata( ). "call method CALL FUNCTION gw_api-zpro_fm EXPORTING input = lv_data IMPORTING output = lv_retu. WHEN ''. gw_retu-success = 'E'. gw_retu-message = 'Interface Not Used!'. lv_retu = /ui2/cl_json=>serialize( data = gw_retu pretty_name = 'L' compress = abap_true ). WHEN OTHERS. ENDCASE. ENDIF. "SET RETURN DATA server->response->set_cdata( EXPORTING data = lv_retu " Character data ). ENDMETHOD.
测试:
三,封装测试函数:
FUNCTION zly01. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" REFERENCE(INPUT) TYPE STRING *" EXPORTING *" REFERENCE(OUTPUT) TYPE STRING *"---------------------------------------------------------------------- TYPES:BEGIN OF ty_retu, success TYPE string, access_token TYPE string, message TYPE string, END OF ty_retu. DATA: gw_retu TYPE ty_retu. gw_retu-success = 'S'. gw_retu-message = 'PRO!'. output = /ui2/cl_json=>serialize( data = gw_retu pretty_name = 'L' compress = abap_true ). ENDFUNCTION.
四,测试:
这里把函数的参数限制死了,后面有时间的话可以用param table。。。先这样用着。