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。。。先這樣用着。