SAP Http接口——通过RESTful实现

最近接到一个需求,用户希望SAP发布Json格式的http接口,在此感谢万能的朋友以及度娘,划水的时候抽空写了下面的Demo,下面开始展示:

哦对,此接口方式适用于觉得Webservice的XML格式太low太麻烦,又觉得Odata太繁杂的外围系统 tmd。
代码啪啪使劲敲,需求more and more,烦躁>.<

由于懒而且http方法中的PutPatchDelete实在觉得没啥用处,本次只定义了GetPost方法两种供大家参考

一.GUI端代码

1.定义类 ZCL_RESTFUL_TEST

在类->接口里添加 IF_HTTP_EXTENSION,如下图
在这里插入图片描述
然后类->方法里,就会蹦出来 IF_HTTP_EXTENSION~HANDLE_REQUEST,如下图
在这里插入图片描述
我们点进IF_HTTP_EXTENSION~HANDLE_REQUEST,新建的是没有任何代码的,我们需要通过传入的Server,调用类 IF_HTTP_REQUESTIF_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:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值