CALL METHOD cl_fdt_json=>data_to_json
EXPORTING
ia_data = iv_data
RECEIVING
rv_json = iv_json.
CALL METHOD me->http_request
EXPORTING
iv_url = iv_url
iv_method = 'POST'
it_header = lt_header
iv_body = iv_json
IMPORTING
ev_data = ev_json.
cl_fdt_json=>json_to_data( EXPORTING iv_json = ev_json CHANGING ca_data = ls_rt ).
封装类方法使用
value( URL ) TYPE ZE_URL_STR 接口地址
value( METHOD ) TYPE STRING DEFAULT 'POST' 请求方法
value( USERNAME ) TYPE STRING OPTIONAL 系统账号
value( PASSWORD ) TYPE STRING OPTIONAL 系统密码
value( HEAD ) TYPE STRING OPTIONAL 抬头参数
value( FORM_FIELDS ) TYPE STRING OPTIONAL 输入参数
value( JSON_IN ) TYPE STRING 接口参数
ERROR_MESSAGE TYPE STRING 输出消息
value( JSON_OUT ) TYPE STRING 输出参数
METHOD http_send.
DATA: len TYPE i, "发送报文长度
ls_tihttpnvp TYPE ihttpnvp,
lt_tihttpnvp TYPE tihttpnvp,
http_client TYPE REF TO if_http_client. "http客户端
"0.获取业务数据/d地址
"1."创建http客户端
"2."设定传输请求内容格式以及编码格式
"3."设置http method 为Get/post
"4."设置待传输内容长度
"5."设置调用方法
"6."设置传入字符串
"7."发送/捕获异常/接收
"8.解析处理数据
"避免中文乱码
"CALL METHOD cl_http_utility=>escape_url
" EXPORTING
" unescaped = json_in
" RECEIVING
" escaped = json_in.
"创建http客户端
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = url
IMPORTING
client = http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF username IS NOT INITIAL AND password IS NOT INITIAL.
"设置用户名密码认证。
http_client->authenticate( username = username password = password ).
"添加用户名和密码到消息头。
http_client->request->set_header_field( name = 'username' value = username ).
http_client->request->set_header_field( name = 'password' value = password ).
ENDIF.
SPLIT head AT ';' INTO TABLE DATA(lt_head).
IF sy-subrc EQ 0.
LOOP AT lt_head INTO DATA(ls_head) .
SPLIT ls_head AT '-' INTO DATA(lv_fname) DATA(lv_value).
http_client->request->set_header_field( name = lv_fname value = lv_value ).
ENDLOOP.
ENDIF.
SPLIT form_fields AT ';' INTO TABLE DATA(lt_form_fields).
IF sy-subrc EQ 0.
LOOP AT lt_form_fields INTO DATA(ls_lt_form_fields) .
APPEND INITIAL LINE TO lt_tihttpnvp ASSIGNING FIELD-SYMBOL(<fs_tihttpnvp>).
SPLIT ls_lt_form_fields AT '-' INTO <fs_tihttpnvp>-name <fs_tihttpnvp>-value.
ENDLOOP.
http_client->request->set_form_fields( lt_tihttpnvp[] ).
ENDIF.
"设定传输请求内容格式以及编码格式
http_client->request->set_content_type( content_type = 'application/json;charset=utf-8' ).
"设置http method
http_client->request->set_method( method ).
"设置待传输内容长度
len = strlen( json_in ).
"设置传入字符串
http_client->request->set_cdata( data = json_in offset = 0 length = len ).
"发送
CALL METHOD http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.
IF sy-subrc NE 0.
http_client->get_last_error( IMPORTING message = error_message ).
ENDIF.
"接收
CALL METHOD http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
"提取返回字符串
IF sy-subrc NE 0.
http_client->get_last_error( IMPORTING message = error_message ).
ELSE.
json_out = http_client->response->get_cdata( ).
IF json_out IS INITIAL.
error_message = '反馈获取失败'.
ENDIF.
ENDIF.
CALL METHOD http_client->close( ).
"将字符串中的回车符替换,否则abap将会识别为#
REPLACE ALL OCCURRENCES OF REGEX '\n' IN json_out WITH space.
REPLACE ALL OCCURRENCES OF REGEX 'true' IN json_out WITH `"true"`.
REPLACE ALL OCCURRENCES OF REGEX 'false' IN json_out WITH `"false"`.
ENDMETHOD.