ABAP 发布rest api http接口sicf(Post Get)

1 篇文章 0 订阅

简介:

Resource Representational State Transfer(REST)

Server和Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本,或者用JPG,WebP传输图片等。

用 HTTP Status Code传递Server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误等

对于资源的具体操作类型,由HTTP动词表示。常用的HTTP动词有下面五个(括号里是对应的SQL命令):

1.GET(SELECT)   : 从服务器获取资源(一项或多项)

2.POST(CREATE)  : 在服务器新建一个资源

3.PUT(UPDATE)   : 在服务器更新资源(客户端提供改变后的完整资源)

4.PATCH(UPDATE) : 在服务器更新资源(客户端提供改变的属性)

5.DELETE(DELETE): 从服务器删除资源。

目录

创建一个rest api接口(REST风格的网络接口)  

事务码:Se24

 接口添加 IF_HTTP_EXTENSION(标准的) SERVER Type Ref To IF_HTTP_SERVER 

然后添加要处理的方式(post get delete) 内部调用就行

在 IF_HTTP_EXTENSION 添加代码,根据需求(新增/修改(POST) 读取(READ)删除(DELETE)等)判断执行上一步的东西。

POST  新增/修改 SERVER Type Ref To IF_HTTP_SERVER

READ 读取 SERVER Type Ref To IF_HTTP_SERVER

DETELE 删除 参数:SERVER Type Ref To IF_HTTP_SERVER

*转化 入参:中文的话用:code:8400


  • 创建一个rest api接口(REST风格的网络接口)  

  • 事务码:Se24

     接口添加 IF_HTTP_EXTENSION(标准的) SERVER Type Ref To IF_HTTP_SERVER 

  • 然后添加要处理的方式(post get delete) 内部调用就行

 

 

  • 在 IF_HTTP_EXTENSION 添加代码,根据需求(新增/修改(POST) 读取(READ)删除(DELETE)等)判断执行上一步的东西。

    lv_method = server->request->get_header_field( name = '~request_method' )."获取操作方式

  源码:

  METHOD if_http_extension~handle_request.
    DATA lv_method TYPE string.
*&获取请求方式
    lv_method = server->request->get_header_field( name = '~request_method' ). 
    CASE lv_method.
      WHEN 'POST'. "新增/修改
        me->post( server = server ). 
      WHEN 'GET'. "读取
        me->get( server = server ). 
      WHEN 'DELETE'."删除
        me->delete( server = server ).
      WHEN OTHERS.
    ENDCASE.
  ENDMETHOD.
POST  新增/修改 SERVER Type Ref To IF_HTTP_SERVER
  METHOD post. 
    DATA lt_data TYPE TABLE OF zta_test_date. 
    "获得转换后数据并输出
    DATA cpcodepage TYPE cpcodepage. 
    DATA(i_json) = server->request->if_http_entity~get_cdata( ). 
    me->code_change( CHANGING i_json = i_json )."将数据进行去空格和去##
    TRY. 
        CALL METHOD /ui2/cl_json=>deserialize "json转化为内表  
          EXPORTING  
            json        = i_json  
            pretty_name = /ui2/cl_json=>pretty_mode-camel_case 
          CHANGING
            data        = lt_data. 
      CATCH cx_root. 
        DATA(mesg) = sy-msgv1 && sy-msgv2 && sy-msgv3 && sy-msgv4.  
    ENDTRY. 
    IF mesg IS NOT INITIAL. 
      server->response->set_status( code = 600 reason = 'NO' ). 
      server->response->set_content_type( 'APPLICATION/JSON' ). 
      server->response->set_cdata( data = mesg ).  
    ELSE. 
      IF lt_data[] IS NOT INITIAL. 
        MODIFY zta_test_date FROM TABLE lt_data."新增修改内表
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 
          EXPORTING 
            wait = 'X'. 
        server->response->set_status( code = 200 reason = 'OK' ). 
        server->response->set_content_type( 'APPLICATION/JSON' ). 
        server->response->set_cdata( data = '成功' ). 
      ELSE. 
        server->response->set_status( code = 800 reason = 'NO' ). 
        server->response->set_content_type( 'APPLICATION/JSON' ). 
        server->response->set_cdata( data = '失败' ). 
      ENDIF. 
    ENDIF. 
 ENDMETHOD
READ 读取 SERVER Type Ref To IF_HTTP_SERVER
 METHOD get.  
    DATA:e_json TYPE string. 
    DATA:i_json TYPE string. 
    DATA:BEGIN OF r_date,   
           sign(1), 
           option(2), 
           low       TYPE sy-datum, 
           hight     TYPE sy-datum, 
         END OF r_date . 
    DATA t_date LIKE TABLE OF r_date. 

    DATA:BEGIN OF wa_data, 
           zdate TYPE datum,
         END OF wa_data. 
    DATA wt_data LIKE TABLE OF wa_data. 

    DATA:lo_json_ser TYPE REF TO cl_trex_json_serializer, 
         lo_json_des TYPE REF TO cl_trex_json_deserializer. 

    i_json = server->request->if_http_entity~get_cdata( ). 

    me->code_change( CHANGING i_json = i_json ). 

*&json 装换为内表
    TRY. 
        CALL METHOD /ui2/cl_json=>deserialize 
          EXPORTING 
            json        = i_json 
            pretty_name = /ui2/cl_json=>pretty_mode-camel_case 
          CHANGING 
            data        = wt_data. 
      CATCH cx_root.
        DATA(mesg) = sy-msgv1 && sy-msgv2 && sy-msgv3 && sy-msgv4. 
    ENDTRY.
"处理查询条件
    IF wt_data[] IS NOT INITIAL. 
      LOOP AT wt_data INTO wa_data. 
        IF sy-tabix = 1. 
          r_date-low = wa_data-zdate. 
          r_date+0(3) = 'IEQ'. 
        ELSE. 
          r_date+0(3) = 'IBT'. 
          r_date-hight = wa_data-zdate. 
        ENDIF. 
      ENDLOOP. 
      APPEND r_date TO t_date. 
      CLEAR r_date. 
    ENDIF.
 
    SELECT * FROM zta_test_date INTO TABLE @DATA(lt_data) WHERE zdate IN @t_date. 
    IF lt_data[] IS INITIAL . 
      server->response->set_status( code = 200 reason = 'no' ). 
      server->response->set_content_type( 'application/json' ). 
      server->response->set_cdata( data = '数据为空' ). 
      RETURN. 
    ENDIF. 

*将数据转换为json格式
    CREATE OBJECT lo_json_ser 
      EXPORTING 
        data = lt_data[]. 
    "固定写法 
    CALL METHOD lo_json_ser->serialize. 
    CALL METHOD lo_json_ser->get_data 
      RECEIVING 
        rval = e_json. 

    IF e_json IS NOT INITIAL. 
      server->response->set_status( code = 200 reason = 'no' ). 
      server->response->set_content_type( 'application/json' ). 
      server->response->set_cdata( data = e_json ). 
    ELSE. 
      server->response->set_status( code = 200 reason = 'no' ). 
      server->response->set_content_type( 'application/json' ). 
      server->response->set_cdata( data = '数据为空' ). 
    ENDIF. 
 ENDMETHOD.
DETELE 删除 参数:SERVER Type Ref To IF_HTTP_SERVER
 METHOD delete.
    DATA:cpcodepage TYPE cpcodepage. 
    DATA lt_data TYPE TABLE OF zta_test_date. 
*&获取数据
    DATA(i_json) = server->request->if_http_entity~get_cdata( ).
*&优化格式
    IF i_json IS NOT INITIAL. 
      me->code_change( CHANGING i_json = i_json ). 
    ENDIF.
*&json 转换内表
    TRY. 
        CALL METHOD /ui2/cl_json=>deserialize
          EXPORTING
            json        = i_json 
            pretty_name = /ui2/cl_json=>pretty_mode-camel_case
          CHANGING
            data        = lt_data.
      CATCH cx_root.
        DATA(mesg) = sy-msgv1 && sy-msgv2 && sy-msgv3 && sy-msgv4. 
    ENDTRY.
*&删除
    IF lt_data[] IS NOT INITIAL.
      DELETE zta_test_date FROM TABLE lt_data.
      IF sy-subrc = 0.
*&返回状态
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        server->response->set_status( code = 200 reason = 'OK' ).
        server->response->set_content_type( 'APPLICATION/JSON' ).
        server->response->set_cdata( data = '成功' ).
      ELSE.
        server->response->set_status( code = 800 reason = 'NO' ). 
        server->response->set_content_type( 'APPLICATION/JSON' ).
        server->response->set_cdata( data = '删除失败'  ).
      ENDIF.
    ELSE.
      server->response->set_status( code = 800 reason = 'NO' ).
      server->response->set_content_type( 'APPLICATION/JSON' ).
      server->response->set_cdata( data = '数据为空' ).
    ENDIF.
 ENDMETHOD 

*转化 入参:中文的话用:code8400

 

METHOD code_change.
    DATA cpcodepage TYPE cpcodepage.

    IF i_json IS NOT INITIAL.
      CALL FUNCTION 'NLS_GET_FRONTEND_CP'
        EXPORTING
          langu                 = sy-langu
        IMPORTING
          frontend_codepage     = cpcodepage
        EXCEPTIONS
          illegal_syst_codepage = 1
          no_frontend_cp_found  = 2
          internal_or_db_error  = 3
          OTHERS                = 4.

      CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
        EXPORTING
          intext            = i_json
          inter_cp          = cpcodepage
          replacement       = 32
        IMPORTING
          outtext           = i_json
        EXCEPTIONS
          invalid_codepage  = 1
          codepage_mismatch = 2
          internal_error    = 3
          cannot_convert    = 4
          fields_not_type_c = 5
          OTHERS            = 6.

      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN i_json WITH space.
      CONDENSE i_json NO-GAPS.
      TRANSLATE i_json TO UPPER CASE.
    ENDIF.
  ENDMETHOD.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP中调用阿里云OSS API,可以使用HTTP请求技术,通过HTTP接口调用阿里云OSS API。具体步骤如下: 1. 在阿里云OSS管理控制台中创建Access Key和Secret Key,并记录下来。 2. 在ABAP程序中编写HTTP请求代码,通过HTTP接口调用阿里云OSS API。例如,上传文件到OSS: ``` DATA: lv_url TYPE string, lv_response TYPE string, lv_bucket_name TYPE string, lv_object_name TYPE string. lv_bucket_name = '<yourBucketName>'. lv_object_name = '<yourObjectName>'. lv_url = |https://{lv_bucket_name}.{endpoint}/{lv_object_name}|. CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_url RECEIVING client = lo_http_client. CALL METHOD lo_http_client->request EXPORTING method = 'PUT' RECEIVING response = lo_http_response. CALL METHOD lo_http_client->send EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2. CALL METHOD lo_http_response->get_status RECEIVING data = lv_response. IF lv_response = '200 OK'. WRITE 'Upload successful.'. ELSE. WRITE 'Upload failed.'. ENDIF. ``` 其中,<yourBucketName>是Bucket的名称,<yourObjectName>是对象的名称。 3. 在ABAP程序中使用Access Key和Secret Key进行身份验证。例如,在HTTP请求中设置Authorization头: ``` DATA: lv_auth_string TYPE string. lv_auth_string = |OSS {accessKeyId}:{signature}|. CALL METHOD lo_http_client->request->set_header_field EXPORTING name = 'Authorization' value = lv_auth_string. ``` 其中,<accessKeyId>是Access Key的ID,<signature>是使用Access Key和Secret Key生成的签名。 需要注意的是,使用HTTP请求调用阿里云OSS API需要按照阿里云OSS的API规范进行编写,保证与阿里云OSS的数据交互的正确性和稳定性。另外,在使用OSS API时,需要按照阿里云OSS的计费标准进行使用,避免产生不必要的费用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值