创建RFC
创建函数模块,模块中实现相应功能,本案例测试通过工厂编码查询工厂数据
传入参数
传出参数
实现代码
DATA:BEGIN OF ls_input,
werks TYPE t001w-werks,
END OF ls_input.
DATA:BEGIN OF ls_output,
werks TYPE t001w-werks,
name1 TYPE t001w-name1,
END OF ls_output.
*---解析入站的json报文
/ui2/cl_json=>deserialize( EXPORTING json = is_input
CHANGING data = ls_input ).
*---通过入站的条件查询数据
IF ls_input-werks IS INITIAL.
es_err_info-flag = abap_true.
es_err_info-message = '请输入工厂编号'.
RETURN.
ENDIF.
SELECT SINGLE
werks
name1
FROM t001w
INTO CORRESPONDING FIELDS OF ls_output
WHERE werks = ls_input-werks.
IF ls_output IS INITIAL.
es_err_info-flag = abap_true.
es_err_info-message = '未查询到工厂数据'.
RETURN.
ENDIF.
*---转换出站的json报文
es_output = /ui2/cl_json=>serialize( data = ls_output ).
配置关联表
新建一张关联表,通过关联表将http请求中的方法名与实际函数模块名关联
新增一条关联数据
定义实现 IF_HTTP_EXTENSION 接口的类
创建类并实现接口IF_HTTP_EXTENSION
实现代码
DATA:ls_input TYPE string,
ls_output TYPE string,
ls_resp TYPE string,
lv_method TYPE string,
lv_text TYPE string.
DATA:lv_funcnam TYPE rs38l_fnam,
ls_err_info TYPE zcms0001.
DATA:BEGIN OF ls_msg,
success TYPE char10,
message(2048),
model TYPE string,
END OF ls_msg,
lt_fields TYPE tihttpnvp.
DATA:lv_flag.
* 获取调用时发送的json数据
ls_input = server->request->if_http_entity~get_cdata( ).
* get HEADER fields
server->request->get_header_fields(
CHANGING
fields = lt_fields "Header fields
).
READ TABLE lt_fields
WITH KEY name = '~query_string'
ASSIGNING FIELD-SYMBOL(<lfs_field>).
IF sy-subrc EQ 0.
SPLIT <lfs_field>-value AT '&&' INTO DATA(lv_client) DATA(lv_query).
SPLIT lv_query AT '=' INTO DATA(lv_param) DATA(lv_value).
IF sy-subrc EQ 0.
* 获取方法是否已配置
SELECT SINGLE * INTO @DATA(ls_test01)
FROM zttestyh01 WHERE method = @lv_value.
IF sy-subrc EQ 0.
lv_funcnam = ls_test01-name.
TRY.
CALL FUNCTION lv_funcnam
EXPORTING
is_input = ls_input
IMPORTING
es_output = ls_output
es_err_info = ls_err_info
EXCEPTIONS
faultmsg = 1
OTHERS = 2.
IF ls_err_info-flag IS INITIAL AND sy-subrc EQ 0.
ls_msg-success = 'true'.
ls_msg-message = '查询到数据'."查询到数据
lv_flag = abap_true.
* 反馈消息转换为JSON
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = ls_msg
RECEIVING
r_json = ls_resp.
FIND FIRST OCCURRENCE OF '"MODEL":'
IN ls_resp MATCH OFFSET DATA(lv_offset).
IF sy-subrc EQ 0.
lv_offset += 8.
ls_resp = ls_resp+0(lv_offset) && ls_output && '}'.
ENDIF.
ELSE.
ls_msg-success = 'false'.
ls_msg-message = ls_err_info-message."请联系相关人员配置处理函数
ENDIF.
CATCH cx_sy_dyn_call_param_missing INTO DATA(lo_m).
ls_msg-success = 'false'.
lv_text = lo_m->get_text( ).
MESSAGE s000(ytest) INTO ls_msg-message WITH lv_text."函数配置错误:&,请检查
CATCH cx_root INTO DATA(lo_cx).
ls_msg-success = 'false'.
lv_text = lo_m->get_text( ).
MESSAGE s000(ytest) INTO ls_msg-message WITH lv_text."函数配置错误:&,请检查
ENDTRY.
ELSE.
* 反馈消息
ls_msg-success = 'false'.
ls_msg-message = '未配置处理函数'."请联系相关人员配置处理函数
ENDIF.
ELSE.
* 反馈消息
ls_msg-success = 'false'.
ls_msg-message = '参数传入不正确'."参数传入不正确
ENDIF.
ELSE.
* 反馈消息
ls_msg-success = 'false'.
ls_msg-message = '未传输查询方法'."未传输查询方法
ENDIF.
* 反馈消息转换为JSON
IF lv_flag IS INITIAL.
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = ls_msg
RECEIVING
r_json = ls_resp.
ENDIF.
* 设置反馈json
server->response->set_cdata(
EXPORTING
data = ls_resp ).
配置SERVICE
事务码SICF
路径default_host/sap下创建新的子元素
在现在登录数据页签里录入登录数据,然后进入处理器清单页签将实现 IF_HTTP_EXTENSION 接口的类名录入,点击保存。
右击服务点击激活
调用测试
右击服务点击测试服务,获取http网址
打开postman,输入http地址然后加上“&&method=TEST01”