SAP HTTP接口

导语:最近要做HTTP的接口,简单的看了一下,分享一下接口实现过程,常用的接口方法分为GET、POST。一般来说GET用作读取,POST用作数据交互。

一、创建测试表

这里先创建一个测试表,进行数据的读取和存储。

 二、创建类

SE24创建一个类,在Class中添加标准的接口【IF_HTTP_EXTENSION】,接口添加后会自动生成一个方法【IF_HTTP_EXTENSION~HANDLE_REQUEST】,为了代码的可阅读性和模块化,具体的实现代码我们放在自建的GET、POST方法中。

代码:IF_HTTP_EXTENSION~HANDLE_REQUEST

 METHOD if_http_extension~handle_request.

    DATA : lv_method   TYPE string.

    lv_method = server->request->get_header_field( '~request_method' ).


    CASE lv_method.
      WHEN 'GET'.
        me->get( server = server ).
      WHEN 'POST'.
        me->post( server = server ).
      WHEN OTHERS.
        server->response->set_header_field( name = 'Content-Type'  value = 'text/html' ).
        server->response->set_cdata( '仅可以使用POST/GET方法进行调用' ).
        server->response->set_status( code   = 200
                                      reason = '' ).
        RETURN.
    ENDCASE.


  ENDMETHOD.

代码:GET

 METHOD get.

    DATA: lt_fields       TYPE tihttpnvp,
          lv_werks        TYPE werks_d,
          lv_content_type TYPE string,
          lv_req_json     TYPE string,
          lv_res_json     TYPE string.
    DATA :r_matnr TYPE RANGE OF mara-matnr.

    lv_req_json = server->request->get_cdata( ).
    DATA : lt_input  TYPE TABLE OF zthttp_test.
    DATA : ls_output TYPE zthttp_test.
    DATA : BEGIN OF ls_error,
             return  TYPE return,
             message TYPE char40,
           END OF ls_error.


    lv_req_json = server->request->get_cdata( ).
    /ui2/cl_json=>deserialize( EXPORTING json = lv_req_json
                                      pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                            CHANGING data = lt_input ).

    LOOP AT lt_input INTO DATA(ls_input).
      APPEND VALUE #( sign = 'I' option =  'EQ' low =  ls_input-matnr ) TO r_matnr.
    ENDLOOP.

    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 'WERKS'.
          lv_werks = <fs>-value.
      ENDCASE.
    ENDLOOP.

    "读取数据
    SELECT * FROM zthttp_test
      INTO TABLE @DATA(lt_zthttp_test)
      WHERE werks = @lv_werks
        AND matnr IN @r_matnr.

    IF lt_zthttp_test IS NOT INITIAL.

      "出参转换为json格式
      lv_res_json = /ui2/cl_json=>serialize( data = lt_zthttp_test ).
      server->response->set_status( code   = 200 reason = 'successfully' ).        "
      server->response->set_header_field( name = 'Content-Type'  value = 'application/json' ).
      server->response->set_cdata( lv_res_json  ).

    ELSE.

      ls_error-return = 'E'.
      ls_error-message = '无符合条件数据'.
      lv_res_json = /ui2/cl_json=>serialize( data = ls_error ).
      server->response->set_status( code   = 200 reason = 'successfully' ).        "
      server->response->set_header_field( name = 'Content-Type'  value = 'application/json' ).
      server->response->set_cdata( lv_res_json  ).

    ENDIF.


  ENDMETHOD.

代码:POST

 METHOD post.

    DATA : lv_req_json TYPE string,
           lv_res_json TYPE string.

    DATA : ls_input TYPE zthttp_test.
    DATA : lt_input TYPE TABLE OF zthttp_test.

    DATA : BEGIN OF ls_output,
             return  TYPE return,
             message TYPE char40,
           END OF ls_output.

    lv_req_json = server->request->get_cdata( ).

    IF lv_req_json IS INITIAL.
      ls_output-return = 'E'.
      ls_output-message = '请输入参数!'.
      lv_res_json = /ui2/cl_json=>serialize( data = ls_output ).
      server->response->set_status( code = 404 reason = '未查询到传入参数,请检查' ).
      server->response->set_header_field( name = 'Content-Type'  value = 'application/json' ).
      server->response->set_cdata( lv_res_json  ).

      RETURN.
    ENDIF.


    /ui2/cl_json=>deserialize( EXPORTING json = lv_req_json
                                      pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                            CHANGING data = lt_input ).



    MODIFY zthttp_test FROM TABLE lt_input.
    COMMIT WORK.
    IF sy-subrc = 0.
      ls_output-return = 'S'.
      ls_output-message = '创建成功!'.
    ELSE.
      ls_output-return = 'S'.
      ls_output-message = '创建失败!'.
    ENDIF.

    "出参转换为json格式
    lv_res_json = /ui2/cl_json=>serialize( data = ls_output ).

    server->response->set_status( code   = 200 reason = 'successfully' ).        "
    server->response->set_header_field( name = 'Content-Type'  value = 'application/json' ).
    server->response->set_cdata( lv_res_json  ).


  ENDMETHOD.

三、创建服务

1、在SICF中新建一个服务,用于HTTP接口使用

创建过程如下图展示。

建议路径:sap->bc->rest->API

2、将Class放入处理器清单中

按理说最好在abap_http中再定义一层服务来存放所有的http接口,这里为了测试方便没有这样做。

四、测试 

1、POST测试

我们根据测试服务所提供的地址,把地址放进POSTMAN进行测试,先测试POST的写入。

2、GET测试

成功写入后,进行GET查询 

 作者:小飞猪猪猪猪猪猪猪–CSDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞猪猪猪猪猪猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值