**引言**
系统间交互的接口方式多种多样,普遍的有数据库直连、RFC、web服务、FTP、EDI/IDOC、中间件、Odata等等,特殊的还有像金税接口和银企直连等需要业务端同步做配置。
本次介绍其中一种RestFul风格的与外围系统交互。
REST(Representational State
Transfer)并不是什么协议也不是什么标准,是一种构架风格,REST指的是一组架构约束条件和原则,是将Http协议的设计初衷作了诠释。
SOAP类型的 WebService,完全是将Http协议作为消息承载,对于Http协议中的各种参数(例如编码,错误码 等)都没有关注。
RESTful 简化了 web service 的设计,它不再需要 wsdl ,也不再需要 soap 协议, 而是通过最简单的 http 协议传输数据 (
包括 xml 或 json) 。
既简化了设计,也减少了网络传输量 (因为只传输代表数据的 xml 或 json ,没有额外的 xml 包装),其架构遵循CRUD原则,
该原则 告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操
作和处理,所以核心操作只有GET,PUT,POST,DELETE。
常规接口开发均以POST方式为主,本文也以POST结合具体例子讲解。
**** **SAP发布Rest接口流程简介**
**1\. SICF配置节点**
Tcode:SICF
**2\. 维护新建服务的相关信息**
主要是维护处理器清单页签:外部系统向sap发送请求的时候,此处定义的类就负责处理请求。
其他页签可以选择不维护。
登录数据页签可配置:用户名密码,这样对方在调用时便不需验证,并可配置http/https方式。
错误页页签可配置:当SAP服务端的资源发生错误的时候,配置一些自定义的返回内容。
配置完成保存并激活服务。
右键该服务选择测试服务,即为接口对应的地址。
**3\. 创建处理类**
Tcode:SE24
①接口页签必须维护:IF_HTTP_EXTENSION
维护之后方法页签里会自动出现一个http相关的方法:
IF_HTTP_EXTENSION~HANDLE_REQUEST
在这个方法中去实现处理http请求的操作。
②方法实现过程
②-1 * 获取对方请求方式
lv_method_name = server->request->get_method( ).该方法可以获取外围系统发送http请求的方法类型:GET、POST等之类。
我们便可以根据外围系统的请求方法来进行不同的处理。
②-2 * 获取对方请求数据
lv_data = server->request->if_http_entity~get_cdata( ).②-3 "JSON转ABAP 解析请求内容
CALL METHOD /ui2/cl_json=>deserializeEXPORTING
json = lv_data "server->request->if_http_entity~get_cdata( )" lv_dataCHANGING
data = ls_head. "拿到HEAD信息判断接口类型②-4 根据解析的数据做相应处理,比如可以约定接口ID,根据不同接口ID调用不通接口对应的方法
②-5 * 设置HTTP的响应状态码,只要接口正常运行CODE都设置200
\-----一般情况可以不做此步操作,http会自动返回,有特殊需求时可以设置特殊code类型
server->response->set_status( code = '200' reason = 'OK' ).
• 将返回内容发出
CALL METHOD server->response->set_cdataEXPORTING
data = lv_data_outoffset = 0
length = lv_len.• 定义格式
CALL METHOD server->response->set_header_fieldEXPORTING
name = 'Content-Type'
value = 'application/json; charset=utf-8'.
③将处理类保存并激活
**4\. 提供接口示例给第三方系统**
restful接口常规报文是以json形式发送,所以接口双方要各自约定报文格式,提供明确的示例给对方系统用来开发。
示例内容以具体业务需求为准。
以下示例为供应商接口,仅供参考。
传入示例:
{
"HEADER": {
"BATCHCOUNT": "1",
"BATCHNUM": "20210112043537",
"INTERFACECODE": "SRM_IF_SUPPLIER"
},
"BODY": [
{
"RESULTID": "1",
"CREATION_GROUP": "J020",
"PARTNER_ROLE": "JIE001X",
"LIFNR": "TEST",
"ANRED": "TEST",
"NAME1": "TEST",
"SORTL": "TEST",
"STRAS": "TEST",
"PSTLZ": "TEST",
"ORT01": "TEST",
"LAND1": "TEST",
"SPRAS": "1",
"TELF1": "TEST",
"TELF2": "TEST",
"TELFX": "TEST",
"KTOKK": "TEST",
"SPERM": "X",
"LFM1_INFO": [
{
"EKORG": "TEST",
"WAERS": "CNY",
"ZTERM": "TEST",
"INCOV": "TEST",
"INCO1": "TEST",
"INCO2_L": "TEST",
"INCO3_L": "TEST",
"VERKF": "TEST",
"TELF1": "TEST",
"WEBRE": "X",
"EKGRP": "TEST",
"PLIFZ": "10",
"SPERM_M1": "X"
}
],
"LFB1_INFO": [
{
"ZUAWA": "TEST",
"AKONT": "TEST",
"ZTERM": "TEST",
"REPRF": "TEST",
"WEBTR": "123.12",
"ZWELS": "TEST",
"TOGRU": "TEST",
"ZAHLS": "TEST",
"BUKRS": "TEST",
"STENR": "TEST"
}
]
}
]
}
返回示例:
{
"BATCHNUM": "20210112043537",
"STATUS": "E",
"MESSAGE": "本次调用发生错误,具体请查看行项目返回信息",
"ITEM_INFO": [
{
"RESULTID": "1",
"STATUS_ITEM": "E",
"MESSAGE_ITEM": "供应商XXX已存在"
}
]
}
**5\. 调试**
在双方系统联调之前,可以通过第三方工具POSTMAN进行接口的调试。
以上述发布的接口为例。
发布篇的介绍到此为止,希望下一期还有机会发表接收篇,谢谢。
作者丨孔 倩
审核丨郑 浩
编辑丨王 锐