sap接口开发前需要搭建结构吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sap接口开发前需要搭建结构吗相关的知识,希望对你有一定的参考价值。
搭建SAP接口的结构是必要的,它可以帮助开发人员更快地开发和实施接口。它不仅提供了一个统一的框架,而且还支持复杂的技术架构。搭建结构的过程涉及到定义接口的消息类型、目标系统类型以及接口技术的支持,以及接口的设计和实施。首先,需要确定接口的消息类型,以决定是同步消息传输还是异步消息传输。其次,需要确定目标系统类型,以确定与之交互的接口技术,如XML,JSON或EDI等。此外,还需要确定接口支持的技术架构,以确定解决方案的可行性。
接下来,需要设计接口,这意味着需要设计接口构建块,如接口模式、消息传输、消息处理等,以便在接口层面实现业务要求。最后,需要实施接口,涉及到编写接口代码,配置接口参数,安装接口软件等。
总之,搭建SAP接口的结构是必要的,它可以帮助开发人员更灵活地开发和实施接口,以满足业务需求。 参考技术A sap接口开发前需要搭建结构包括:1.明确开发需求;2.制定开发方案;3.确定接口类型和技术架构;4.选择合适的sap接口开发工具;5.搭建环境和数据库;6.编写sap接口程序;7.编写sap接口测试代码;8.调试和测试sap接口。
sap restful json接口动态调用RFC,生成动态结构
需求:项目上有一个restful接口需求,想着能不能做成动态的,只发布一个sap的restful接口出去,然后外围系统根据不同的json来动态调用sap的rfc。
结果:结合同事以前的开发demo和abapgit上面大佬的abap_fm_json demo,写了一个简易的demo,如下代码:
METHOD http_broker.
DATA: ptab TYPE abap_func_parmbind_tab,
ptab_line TYPE abap_func_parmbind,
etab TYPE abap_func_excpbind_tab,
etab_line TYPE abap_func_excpbind,
data_export TYPE REF TO data,
data_ref TYPE REF TO data,
lv_response_json TYPE string. "接口返回参数
DATA: dyn_table TYPE REF TO data.
DATA: lt_dd04l TYPE STANDARD TABLE OF dd04l.
DATA:lv_error_msg TYPE bapi_msg.
"检查函数是否存在
SELECT funcname, paramtype, pposition, parameter, structure
FROM fupararef
WHERE funcname = @iv_function_name
INTO TABLE @DATA(parameters_tab).
IF sy-subrc <> 0.
response->set_status( code = 400 reason = 'target_function no exist,Please check the url address' ).
EXIT.
ENDIF.
LOOP AT parameters_tab ASSIGNING FIELD-SYMBOL(<ptab>).
IF strlen( <ptab>-structure ) > 30.
CONTINUE.
ENDIF.
lt_dd04l = VALUE #( BASE lt_dd04l ( domname = <ptab>-structure ) ).
ENDLOOP.
IF lt_dd04l IS NOT INITIAL.
SELECT domname FROM dd04l
FOR ALL ENTRIES IN @lt_dd04l
WHERE domname = @lt_dd04l-domname
INTO TABLE @DATA(data_elements).
ENDIF.
" MAPPING 字段映射
me->json_mapping( EXPORTING iv_function_name = iv_function_name
IMPORTING name_mappings_i = DATA(lt_mapping_i)
name_mappings_o = DATA(lt_mapping_o)
name_mappings_x = DATA(lt_mapping_x) ).
TRY.
"函数入参动态拼接
LOOP AT parameters_tab ASSIGNING FIELD-SYMBOL(<parameter>).
CLEAR ptab_line.
ptab_line-name = <parameter>-parameter.
ptab_line-kind = COND #( WHEN <parameter>-paramtype = 'E' THEN abap_func_importing
WHEN <parameter>-paramtype = 'I' THEN abap_func_exporting
WHEN <parameter>-paramtype = 'T' THEN abap_func_tables
WHEN <parameter>-paramtype = 'C' THEN abap_func_changing
ELSE ''
).
DATA(json_field_name) = COND string( WHEN ptab_line-kind = abap_func_exporting THEN 'IMPORT'
WHEN ptab_line-kind = abap_func_tables THEN 'TABLE'
WHEN ptab_line-kind = abap_func_changing THEN 'CHANGE'
WHEN ptab_line-kind = abap_func_importing THEN 'EXPORT'
ELSE ''
).
"解析传入参数
DATA(json) = request->get_cdata( ).
DATA(json_data) = zcl_json=>generate( json = json name_mappings = lt_mapping_i ).
ASSIGN json_data->* TO FIELD-SYMBOL(<json_data>).
READ TABLE lt_mapping_x INTO DATA(ls_x) WITH KEY abap = <parameter>-parameter.
IF sy-subrc EQ 0.
DATA(lv_parameter) = ls_x-json.
ELSE.
lv_parameter = <parameter>-parameter.
ENDIF.
"根据函数的入参匹配接口传入参数
ASSIGN COMPONENT lv_parameter OF STRUCTURE <json_data> TO FIELD-SYMBOL(<parameter_val>).
IF sy-subrc <> 0 OR json_field_name = 'EXPORT'.
CASE json_field_name.
WHEN 'TABLE'.
"创建动态表结构
CREATE DATA dyn_table TYPE TABLE OF (<parameter>-structure).
"创建动态内表
ASSIGN dyn_table->* TO FIELD-SYMBOL(<dyn_table>).
GET REFERENCE OF <dyn_table> INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.
CONTINUE.
WHEN OTHERS.
"动态定义承接返回参数的结构
CREATE DATA data_export TYPE (<parameter>-structure).
ASSIGN data_export TO FIELD-SYMBOL(<data_export>).
ptab_line-value = <data_export>.
INSERT ptab_line INTO TABLE ptab.
CONTINUE.
ENDCASE.
ENDIF.
CREATE DATA data_ref TYPE (<parameter>-structure).
FIELD-SYMBOLS: <temp> TYPE any.
ASSIGN <parameter_val>->* TO <temp>.
IF data_ref IS BOUND.
ASSIGN data_ref->* TO FIELD-SYMBOL(<data_ref>).
ENDIF.
"将传入参数按照特定格式转换
IF line_exists( data_elements[ domname = <parameter>-structure ] ).
<data_ref> = <temp>.
ELSE.
DATA(json_temp) = /ui2/cl_json=>serialize( data = <parameter_val> ).
/ui2/cl_json=>deserialize( EXPORTING json = json_temp name_mappings = lt_mapping_i CHANGING data = <data_ref> ).
ENDIF.
GET REFERENCE OF <data_ref> INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.
ENDLOOP.
CATCH cx_sy_create_data_error INTO DATA(lo_data_error).
lv_error_msg = lo_data_error->get_text( ).
me->set_message( EXPORTING request = request
iv_function_name = iv_function_name
iv_code = 400
iv_mtype = 'E'
iv_reason = 'target_function Handling Exceptions'
iv_message = lv_error_msg
IMPORTING response = response ).
EXIT.
ENDTRY.
etab_line-name = 'OTHERS'.
etab_line-value = 10.
INSERT etab_line INTO TABLE etab.
TRY.
"动态调用函数,业务逻辑部分
CALL FUNCTION iv_function_name
PARAMETER-TABLE
ptab
EXCEPTION-TABLE
etab.
SORT parameters_tab BY parameter.
CLEAR:data_ref.
UNASSIGN:<data_ref>.
LOOP AT ptab INTO ptab_line WHERE kind <> abap_func_exporting.
ASSIGN ptab_line-value->* TO <data_ref>.
"Serialize Data to Json
DATA(lv_string) = /ui2/cl_json=>serialize( data = <data_ref> name_mappings = lt_mapping_o ).
READ TABLE lt_mapping_x INTO ls_x WITH KEY abap = ptab_line-name.
IF sy-subrc EQ 0.
lv_parameter = ls_x-json.
ELSE.
lv_parameter = ptab_line-name.
ENDIF.
IF lv_response_json IS INITIAL.
lv_response_json = |" lv_parameter ": lv_string |.
ELSE.
lv_response_json = | lv_response_json ," lv_parameter ": lv_string |.
ENDIF.
ENDLOOP.
lv_response_json = '' && lv_response_json && ''.
CATCH cx_sy_dyn_call_param_not_found INTO DATA(lo_error_no_found).
lv_error_msg = lo_error_no_found->get_text( ).
CATCH cx_sy_dyn_call_param_missing INTO DATA(lo_error_missing).
lv_error_msg = lo_error_missing->get_text( ).
CATCH cx_sy_dyn_call_parameter_error INTO DATA(lo_error_parameter).
lv_error_msg = lo_error_parameter->get_text( ).
CATCH cx_sy_dyn_call_error INTO DATA(lo_error_call).
lv_error_msg = lo_error_call->get_text( ).
ENDTRY.
IF lv_error_msg IS NOT INITIAL.
me->set_message( EXPORTING request = request
iv_function_name = iv_function_name
iv_code = 400
iv_mtype = 'E'
iv_reason = 'target_function Handling Exceptions'
iv_message = lv_error_msg
IMPORTING response = response ).
EXIT.
ENDIF.
response->set_status( code = 200 reason = '' ).
response->set_header_field( name = 'Content-Type' value = 'application/json' ).
response->set_cdata( lv_response_json ).
ENDMETHOD.
PS:里面有一些表和mapping方法可以去掉,对代码本身没有影响。
以上是关于sap接口开发前需要搭建结构吗的主要内容,如果未能解决你的问题,请参考以下文章
sap restful json接口动态调用RFC,生成动态结构