在实施项目的过程中SAP通常要与第三方系统集成,SAP也提供了如RFC、 WebService 等多种接口方式。今天我们了解一下API的集成方式。
SAP作为服务提供方被第三方调用,就需要定义一个自定义类,这个类需要实现IF_HTTP_EXTENSION 接口, IF_HTTP_EXTENSION
接口只有一个方法 HANDLE_REQUEST。自定义的这个类必须实现 HANDLE_REQUEST 方法 。然后用事务码SICF创建服务并激活。
接下来我们一步一步做一下。首先用事务码SE 24 创建自定义类: Z_TEST_RESTFUL 。
在接口 页签下输入 IF_HTTP_EXTENSION,然后回车,再到方法页签下双击 IF_HTTP_EXTENSION~HANDLE_REQUEST
进到代码中。
在这里我们将查询物料及其描述,并将数据以JSON格式输出。当然这种方式不仅仅支持查询数据,还可以支持POST/ PUT/DELETE 等方式。
可根据代码 server->request->get_header_field( '~request_method' )获取GET/POST/
PUT/DELETE方式
。获得具体方式后,可根据不同的方式,实现不同的业务逻辑。需要说明的是API是以JSON作为交互的数据格式,由于第三方系统的不同,在JSON解析时可能会有差异,需要灵活应对。本例仅以GET方式举例。
接下来用事务码SICF配置服务和激活,在 /default_host/sap/ 目录下新建 ZTEST ,在处理器清单页签下输入自定义类
Z_TEST_RESTFUL ,保存。
激活后,选中 ZTEST 右键可以测试服务,即可以看到 SAP提供的服务路径和测试结果。
也可用其他测试工具进行测试,效果是一样的。这样SAP发布API服务。
SAP调用第三方API主要分为五个步骤: 1\. 根据第三方提供URL创建HTTP服务。
由于开发、测试、生产系统各不相同,可以采用配置表形式存储URL,根据URL创建客户端请求。
"创建客户端请求
CALL METHOD cl_http_client => create_by_urlEXPORTING
url = lv_urlIMPORTING
client = lo_http_clientEXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4 .
2\. 设置http request的参数(如: Content-Type 、~ request_method 等)。
“ 设定传输请求内容格式以及编码格式
lo_http_client -> request -> set_content_type ( content_type ='application/JSON; charset=utf-8' ).
"设定调用服务
lo_http_client -> request -> set_method ( if_http_request =>co_request_method_get ).
"设置调用方法
CALL METHOD lo_http_client -> request -> set_header_fieldEXPORTING
name = '~request_method'
value = 'POST' .
3\. 把传输数据转换成JSON格式。
由于第三方系统格式的不同,需要构造复杂的数据类型,还涉及字符替代等,可根据具体情况具体分析。
"设置待传输内容 代码
lv_len = strlen ( lv_json_str ).
CALL METHOD http_client_data -> request -> set_cdataEXPORTING
data = lv_json_stroffset = 0
length = lv_len .4\. 发送http请求。
"发送数据
lo_http_client -> send (
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5 ).
5\. 接收返回的数据,判断调用是否成功。
先接收返回数据内容,再获取其中内容进行判断是否成功。注意获取的数据格式也为JSON。
"接收返回
lo_http_client -> receive (
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3 ).
"提取返回字符串
IF sy \- subrc EQ 0 .
gv_json_out = lo_http_client -> response -> get_cdata ( ).
CALL METHOD lo_http_client -> response -> get_statusIMPORTING
code = p_code
reason = p_reason .
ELSE .
CALL METHOD lo_http_client -> get_last_errorIMPORTING
code = l_sysubrc
message = l_error .
MESSAGE l_error TYPE 'S' DISPLAY LIKE 'E' .
RETURN .
ENDIF .至此结束。