日常我们在接口开发的过程中,通常有很多接口方式,比如RFC、Webservice、Restful等方式,
这篇文章主要介绍关于如何在SAP中主动调用外部的REST服务
关键引用类:
if_http_client
代码样例参考:
FUNCTION ZJKTEST.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(CLIENTID) TYPE ZEBC_CLIENTID
*" REFERENCE(PASSWORD) TYPE ZEBC_PASSWORD
*" REFERENCE(COMPANYNO) TYPE ZEBC_COMPANYNO
*" REFERENCE(DATE) TYPE DATS
*" EXPORTING
*" REFERENCE(MSGTY) TYPE MSGTY
*" REFERENCE(MESSAGE) TYPE STRING
*" TABLES
*" ITEMS STRUCTURE ZSTJKCMB001_ITEM
*"----------------------------------------------------------------------
DATA: json_ser TYPE REF TO cl_trex_json_serializer,
json_des TYPE REF TO cl_trex_json_deserializer.
DATA: wlo_http_client TYPE REF TO if_http_client.
DATA: wlv_respon TYPE string,
wlv_subrc TYPE sy-subrc,
wlv_page TYPE i,
wlv_page_string TYPE string,
wlv_page_sum TYPE i,
wlv_string TYPE string,
wlv_hashstring TYPE string,
wlv_url TYPE string VALUE 'https://test.xxxxx'.
* 设置报文内容(json格式字符串)
* "密钥+系统日期进行MD5加密
* CONCATENATE password
* sy-datum
* INTO wlv_string.
* CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
* EXPORTING
* alg = 'MD5'
* data = wlv_string
* IMPORTING
* hashstring = wlv_hashstring
* EXCEPTIONS
* unknown_alg = 1
* param_error = 2
* internal_error = 3
* OTHERS = 4.
* TRANSLATE wlv_hashstring TO LOWER CASE.
wlv_page = 0.
DO.
wlv_page = wlv_page + 1.
IF wlv_page > 1.
IF wlv_page_sum = 0 OR wlv_page > wlv_page_sum.
EXIT.
ENDIF.
ENDIF.
wlv_page_string = wlv_page.
CONDENSE wlv_page_string.
CONCATENATE '{"paraMap":{"clientId":"'
clientid
'","clientSecret":"'
* wlv_hashstring
password
'", "corNum":"'
companyno
'","postDate":"'
date(4) '-' date+4(2) '-' date+6(2)
'","cardMarkFlag":"'
space
'","currPage":"'
wlv_page_string
'"}}'
INTO wlv_string.
DATA: wlv_ssl_id TYPE ssfapplssl VALUE 'ANONYM'.
"创建客户端请求
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = wlv_url
ssl_id = wlv_ssl_id
IMPORTING
client = wlo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
"设定传输请求内容格式以及编码格式
wlo_http_client->request->set_content_type( content_type = 'application/json;charset=GB18030' ).
"设定调用服务
wlo_http_client->request->set_method( if_http_request=>co_request_method_post ).
wlo_http_client->propertytype_accept_cookie = wlo_http_client->co_enabled.
"设置待传输内容
wlo_http_client->request->set_data( cl_abap_codepage=>convert_to( source = wlv_string ) ).
"发送请求
wlo_http_client->send( EXCEPTIONS http_communication_failure = 1
http_invalid_state = 2 ).
IF sy-subrc <> 0.
"操作失败,获取失败原因
wlo_http_client->get_last_error( IMPORTING message = message ).
msgty = 'E'.
RETURN.
ENDIF.
"读取远程服务返回的处理过结果。
wlo_http_client->receive( EXCEPTIONS http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3 ).
IF sy-subrc <> 0 .
"wlv_subrc = sy-subrc.
wlo_http_client->get_last_error( IMPORTING message = message ).
msgty = 'E'.
RETURN.
ELSE.
"读取返回返回内容
CLEAR wlv_respon.
CALL METHOD cl_abap_codepage=>convert_from
EXPORTING
source = wlo_http_client->response->get_data( )
codepage = 'GB18030'
RECEIVING
result = wlv_respon.
ENDIF.
CALL METHOD wlo_http_client->close.
DATA: wls_interface TYPE zstjkcmb001. "返回参数接口结构
CALL METHOD /ui2/cl_json=>deserialize( "Jason 转SAP内表结构
EXPORTING
json = wlv_respon
CHANGING
data = wls_interface ).
IF wls_interface-success IS INITIAL.
msgty = 'E'.
message = wls_interface-message.
RETURN.
ENDIF.
wlv_page_sum = wls_interface-sumpage.
APPEND LINES OF wls_interface-object TO items.
ENDDO.
ENDFUNCTION.