最近接到一个需求,用户希望SAP发布Json格式的http接口,在此感谢万能的朋友以及度娘,划水的时候抽空写了下面的Demo,下面开始展示:
哦对,此接口方式适用于觉得Webservice的XML格式太low太麻烦,又觉得Odata太繁杂的外围系统 tmd。
代码啪啪使劲敲,需求more and more,烦躁>.<
由于懒而且http方法中的Put、Patch和Delete实在觉得没啥用处,本次只定义了Get和Post方法两种供大家参考
以下,是发布SAP RESTful接口的全过程目录:
一.GUI端代码
1.定义类 ZCL_RESTFUL_TEST
在类->接口里添加 IF_HTTP_EXTENSION,如下图
然后类->方法里,就会蹦出来 IF_HTTP_EXTENSION~HANDLE_REQUEST,如下图
我们点进IF_HTTP_EXTENSION~HANDLE_REQUEST,新建的是没有任何代码的,我们需要通过传入的Server,调用类 IF_HTTP_REQUEST 和 IF_HTTP_RESPONSE,对参数进行处理并传出处理消息,这两个类就不详细说了,大家去SE24里瞅瞅应该就能明白,处理代码如下图。
2.Get事件
把传入的值咔咔咔处理一下,写一个SQL或者调一个FM,最后通过SET_CDATA传出,没啥好讲的,有手就会。
代码如下:
DATA: lt_fields TYPE tihttpnvp,
s_carrid TYPE rseloption,
s_connid TYPE rseloption,
lv_content_type TYPE string.
**A 请求参数——查找http头数据,全量读取,适合读取文件
* DATA(lv_query) = server->request->get_header_field( '~query_string' ).
* IF lv_query IS INITIAL.
* " Sets current HTTP status code
* server->response->set_status( code = 404 reason = '未查询到传入参数,请检查' ).
* RETURN.
* ENDIF.
* TRANSLATE lv_query TO UPPER CASE.
*B 请求参数——查找http头数据,生成内表,适合传值
server->request->get_form_fields( CHANGING fields = lt_fields ).
IF lt_fields IS INITIAL.
" Sets current HTTP status code
server->response->set_status( code = 404 reason = '未查询到传入参数,请检查' ).
RETURN.
ENDIF.
LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<fs>).
TRANSLATE <fs>-name TO UPPER CASE.
CASE <fs>-name.
WHEN 'CARRID'.
APPEND VALUE #( sign = 'I' option = 'EQ' low = <fs>-value ) TO s_carrid.
WHEN 'CONNID'.
APPEND VALUE #( sign = 'I' option = 'EQ' low = <fs>-value ) TO s_connid.
ENDCASE.
ENDLOOP.
SELECT *
FROM sflight
INTO TABLE @DATA(lt_sflight)
WHERE carrid IN @s_carrid
AND connid IN @s_connid.
" Sets the HTTP body of this entity to the given char. data
server->response->set_cdata(
/ui2/cl_json=>serialize( data = lt_sflight"将内表转换为json传出
compress = abap_true
pretty_name = /ui2/cl_json=>pretty_mode-camel_case ) ).
" Sets current HTTP status code
server->response->set_status( code = 200 reason = 'OK' ).
lv_content_type = 'application/json'.
" Set the Body Type (Text/HTML, for example)
server->response->set_content_type( lv_content_type ).
3.Post事件
和GET类似,瞅瞅代码就行(需要注意一点,代码还是尽可能复用比较好,少些一点是一点,这里用了action区分不同的处理类,如果有需要可以通过action来区分,我比较懒,就略过了- -)
代码如下:
DATA:
BEGIN OF ls_request,
action TYPE string, " 可以用来区分具体对应的处理类
data TYPE TABLE OF sflight, " 表结构
END OF ls_request,
lv_json TYPE string,
lt_sflight TYPE TABLE OF sflight,
lv_content_type TYPE string.
" Delivers the HTTP body of this entity as character data
lv_json = server->request->get_cdata( ).
IF lv_json IS INITIAL.
server->response->set_status( code = 404 reason = '未解析到Body参数,请检查' ).
RETURN.
ENDIF.
" 将Json转换成内表
/ui2/cl_json=>deserialize( EXPORTING json = lv_json CHANGING data = ls_request ).
CASE ls_request-action.
WHEN 'SFLIGHT'.
WHEN OTHERS.
server->response->set_status( code = 404 reason = '未解析到对应Action,请检查' ).
RETURN.
ENDCASE.
IF ls_request-data IS NOT INITIAL.
lt_sflight = ls_request-data.
ENDIF.
MODIFY sflight FROM TABLE lt_sflight.
" Sets the HTTP body of this entity to the given char. data
server->response->set_cdata(
/ui2/cl_json=>serialize( data = 'Success' " 将内表转换为json传出
compress = abap_true
pretty_name = /ui2/cl_json=>pretty_mode-camel_case ) ).
" Sets current HTTP status code
server->response->set_status( code = 200 reason = 'OK' ).
lv_content_type = 'application/json'.
" Set the Body Type (Text/HTML, for example)
server->response->set_content_type( lv_content_type ).
二.GUI端配置
TCode:SICF 配置服务
从步骤1->3即可,具体配置参数如下:
创建成功之后我们激活服务,然后点击测试服务,即可弹出我们需要的http接口URL。
三.Postman调试
Postman使用方法
接口调试,最近一直用的Postman,Runapi之类的也可以,官网下载即可,具体怎么操作,大家百度百度百度度。
Get方法的大致步骤如下,填入传入的carrid和connid,返回具体的数据:
Post方法大致步骤如下,填入Body,返回参数Success: