SAP 发布HTTP接口
1.SE24创建类
在接口中填写 IF_HTTP_EXTENSION 继承该类并激活
实现继承的HANDLE_REQUEST方法:IF_HTTP_EXTENSION~HANDLE_REQUEST
METHOD if_http_extension~handle_request.
DATA: lt_fields TYPE tihttpnvp,
lv_data TYPE string,
lv_html TYPE string.
DATA:BEGIN OF it,
modelcode TYPE zppt0002-zzxh,
carcode TYPE zppt0002-zcjnum,
carname TYPE zppt0002-zzmc,
cencode TYPE zppt0002-zzkbm,
modelname TYPE zppt0002-zzmc,
confnum TYPE zppt0002-matnr,
carcolor TYPE zppt0002-zzys,
motornum TYPE zppt0002-zdjnum,
END OF it.
DATA:item LIKE TABLE OF it.
DATA: start_date TYPE erdat,
end_date TYPE erdat,
str1 TYPE string,
str2 TYPE string,
str3 TYPE string,
key TYPE string,
value TYPE string.
DATA:lin TYPE sy-tabix.
DATA: wa LIKE LINE OF lt_fields.
FIELD-SYMBOLS: <fs_field> LIKE LINE OF lt_fields.
*" get HEADER fields
server->request->get_header_fields(
CHANGING
fields = lt_fields " Header fields
).
lv_data = server->request->if_http_entity~get_cdata( ).
" Read the fields table and look for name "~query_string" -- this will contain the URL query
READ TABLE lt_fields INTO wa WITH KEY name = '~query_string'.
IF sy-subrc = 0.
SPLIT wa-value AT '&' INTO str1 str2 str3.
IF str2 IS INITIAL OR str3 IS INITIAL .
start_date = sy-datum.
end_date = sy-datum.
ELSE.
SPLIT str2 AT '=' INTO key value.
start_date = value.
CLEAR:key,value.
SPLIT str3 AT '=' INTO key value.
end_date = value.
ENDIF.
ENDIF.
* 获取数据
SELECT
zppt0002~zzxh AS modelcode
zppt0002~zcjnum AS carcode
zppt0002~zzmc AS carname
zppt0002~zzkbm AS cencode
zppt0002~matnr AS confnum
zppt0002~zzys AS carcolor
zppt0002~zdjnum AS motornum
INTO CORRESPONDING FIELDS OF TABLE item
FROM zppt0002
INNER JOIN zcxsz ON zcxsz~matnr = zppt0002~matnr
WHERE zppt0002~ZODAT >= start_date AND zppt0002~ZODAT <= end_date AND zppt0002~ZSTATUS = 'Z05'.
IF sy-subrc EQ 0.
DESCRIBE TABLE item LINES lin.
* 拼接json字符串
LOOP AT item INTO it.
IF sy-tabix = 1.
lv_html = '['.
ENDIF.
IF lin = sy-tabix.
CONCATENATE lv_html '{'
'"modelCode":"' it-modelcode '",'
'"carCode":"' it-carcode '",'
'"carName":"' it-carname '",'
'"cenCode":"' it-cencode '",'
'"modelName":"' it-carname '",'
'"confNum":"' it-confnum '",'
'"carColor":"' it-carcolor '",'
'"motorNum":"' it-motornum '"'
'}]'
INTO lv_html.
ELSE.
CONCATENATE lv_html '{'
'"modelCode":"' it-modelcode '",'
'"carCode":"' it-carcode '",'
'"carName":"' it-carname '",'
'"cenCode":"' it-cencode '",'
'"modelName":"' it-carname '",'
'"confNum":"' it-confnum '",'
'"carColor":"' it-carcolor '",'
'"motorNum":"' it-motornum '"'
'},'
INTO lv_html. "SEPARATED BY space.
ENDIF.
ENDLOOP.
* 返回响应
server->response->set_cdata(
EXPORTING
data = lv_html " Character data
* offset = 0 " Offset into character data
* length = -1 " Length of character data
).
ENDIF.
* 设置返回响应格式为json
CALL METHOD server->response->if_http_entity~set_content_type
EXPORTING
content_type = 'application/json'.
ENDMETHOD.
2.定义服务,SICF创建服务
设置服务的账号及密码
在处理器清单填写上面我们实现的类
保存激活,测试服务
因我本地未配置SAP域名映射所以测试失败
改为IP地址后测试通过
将接口地址开放到外部
通过nginx反向代理,进行防火墙映射。
到此结束整个接口开发。
后记
此处数据转json,前期我采用转换类cl_trex_json_serializer如下,但是其转换后的json格式并不是标准的json格式,key值缺少双引号。比较简单我直接进行了拼接
DATA lc_json TYPE REF TO cl_trex_json_serializer. "json格式转换
CREATE OBJECT lc_json.
CALL METHOD lc_json->serialize_int
EXPORTING
data = lt_vldata
RECEIVING
r_json = l_json_data.
TRANSLATE l_json_data TO LOWER CASE.
CONCATENATE l_url l_json_data INTO l_url.
后期寻找后,解决方法是将该类复制修改其RECURSE方法组合形式就可以采用此种方式
借鉴资料
SAP发布REST/HTTP接口
SAP调用RestfulApi接口POST数据到外部系统
SAP的JSON没有双引号问题