restful实践三(第三方调用sap)

1.se24   IF_HTTP_EXTENSION 创建类

*---获取 调用方法 GET or post
  DATA(lv_method) = server->request->get_method( ).

  CASE lv_method.
  WHEN 'GET'.
    me->get( server ).
  WHEN 'POST'.
    me->post( server ).
  WHEN OTHERS.
    server->response->set_status( CODE = 405 reason = '请求方法不支持,请联系管理员' ).
  ENDCASE.

  METHOD post.
    TYPES:BEGIN OF ty_detaillist,
            amount(8)    TYPE   p DECIMALS 2,    "不含税金额
            taxamount(8) TYPE   p DECIMALS 2,    "税额
            id           TYPE   string,         "id
          END OF ty_detaillist.

    DATA :BEGIN OF odata,
            invoicecode        TYPE string,  "发票代码
            invoiceno          TYPE string,  "发票号码
            invoicedrewdate    TYPE date,  "开票日期
            amount(8)          TYPE p DECIMALS 2,    "不含税金额
            taxamount(8)       TYPE p DECIMALS 2,    "税额
            amountwithtax(8)   TYPE p DECIMALS 2,    "价税合计
            checkcode          TYPE string,  "校验码
            invoicestatus      TYPE integer,  "发票状态
            pdfurl             TYPE string,  "PDF地址
            externaldocumentno TYPE string,  "流水号
            detaillist         TYPE TABLE OF ty_detaillist,
          END OF odata,

          BEGIN OF odata1,
            code     TYPE string,
            message  TYPE string,
            serialno TYPE string,
            data     LIKE  odata,
          END OF odata1,

          BEGIN OF ls_request,
            businesstype TYPE  string,
            data         TYPE  string,
          END OF ls_request,

          e_msg     TYPE zrtbc010_s,

          lv_json   TYPE string,
          lt_msg    TYPE TABLE OF bapiret2,
          ls_msg    TYPE bapiret2,
          ls_stru   TYPE zrtfi123_s,
          i_itab    TYPE zrtfitt123a,
          ls_itab   TYPE LINE OF zrtfitt123a,
          i_itab1   TYPE zrtfitt123b,
          ls_itab1  TYPE LINE OF zrtfitt123b,
          lv_num(6) TYPE n.

*&------获取body
    lv_json =  server->request->get_cdata( ).

    IF lv_json IS INITIAL.
      server->response->set_status(
      EXPORTING
        code   =  404                         " HTTP status code
        reason =  '未解析到Body参数,请检查'   " HTTP status description
        ).
      RETURN.
    ENDIF.

  DATA:LV_CHAR(10) TYPE C.
  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.  "09 TAB符
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>CR_LF.  "0D0A 回车换行
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>VERTICAL_TAB.  "0B 垂直制表符
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>NEWLINE.  "0A 换行
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>FORM_FEED.  "0C 换页
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>BACKSPACE.  "08 退格符
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_LITTLE.  "(UTF-16LE)的文件头
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_UTF8.  "(UTF-8)的文件头
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

*&------将JSON转换成内表
    /ui2/cl_json=>deserialize(
    EXPORTING
      json        = lv_json
    CHANGING
      data        = ls_request
          ).

    /ui2/cl_json=>deserialize(
    EXPORTING
    json        = ls_request-data
    CHANGING
    data        = odata1
          ).

*&------内表逻辑处理 strat-------
    IF odata1-code = '200'.
*--------------ls_stru
      ls_stru-zlsdbh                   = odata1-data-externaldocumentno.      "流水单编号
*------------i_itab
      ls_itab-zinvcode                 = odata1-data-invoicecode.             "发票代码(全电没有)
      ls_itab-zinvno                   = odata1-data-invoiceno.               "发票号码
      ls_itab-zinvdate                 = odata1-data-invoicedrewdate+0(8).    "开票日期
      ls_itab-zinvtotalprice           = odata1-data-amount.                  "不含税金额
      ls_itab-zinvtotaltax             = odata1-data-taxamount.               "税额
      ls_itab-zinvtotalpricetax        = odata1-data-amountwithtax.           "价税合计
      ls_itab-zjym                     = odata1-data-checkcode.               "校验码(全电没有)
      "税控码(taxCode)技术文档中:历史废弃字段,对接时无需处理
      "二维码(ZEWM)技术文档没找到
      IF odata1-data-invoicestatus = '10'.
        ls_itab-zfpzt = '0'.
      ELSEIF odata1-data-invoicestatus = '20'.
        ls_itab-zfpzt = '4'.
      ELSEIF odata1-data-invoicestatus = '30'.
        ls_itab-zfpzt = '2'.
      ENDIF.
*      ls_itab-zfpzt                    = odata1-data-invoicestatus.           "发票状态
      ls_itab-zpdfurl                  = odata1-data-pdfurl.                  "fdf地址
      APPEND ls_itab TO i_itab.
      CLEAR:ls_itab.

*----------i_itab1
      ls_itab1-zinvno                    = odata1-data-invoiceno.               "发票号码
      LOOP AT odata1-data-detaillist INTO DATA(ls_detaillist).
        lv_num  = lv_num + 1.
        ls_itab1-buzei                   = lv_num.                             "发票凭证中的凭证项目
        ls_itab1-zgdtotalprice           = ls_detaillist-amount.               "金额
        ls_itab1-zgdtotaltax             = ls_detaillist-taxamount.            "税额
        ls_itab1-zddmxxh                 = ls_detaillist-id.                   "订单明细ID
        APPEND ls_itab1 TO i_itab1.
      ENDLOOP.

      CLEAR:ls_itab1,lv_num.
*---------
      CALL FUNCTION 'Z_RTFI_XXFP_RECEIVE_INVOICE'
        EXPORTING
          i_stru  = ls_stru
          i_itab  = i_itab
          i_itab1 = i_itab1
        IMPORTING
          e_msg   = e_msg.

      IF e_msg-type = 'S'.
        "将返回消息转成json返回回去
        ls_msg-type    = 'S'.
        ls_msg-message = 'Success'.
      ELSE.
        "将返回消息转成json返回回去
        ls_msg-type    = 'E'.
        ls_msg-message = e_msg-message.
      ENDIF.

    ELSE.
      "将返回消息转成json返回回去
      ls_msg-type    = 'E'.
      ls_msg-message = 'code<>200'.
    ENDIF .


    APPEND ls_msg TO lt_msg.
    CLEAR:ls_msg.

*&------内表逻辑处理 end---------

    server->response->set_cdata(
      /ui2/cl_json=>serialize(
      data        = lt_msg
      compress    = abap_true                  "返回参数为空的情况就不展示
      pretty_name = 'X'                        小写:'L' .遇到下划线得第一个字母变大写,并且下划线消失:'X'
        )   ).

*&----设置成功得返回状态
    server->response->set_status(
    EXPORTING
      code   =  200   " HTTP status code
      reason =  'OK'   " HTTP status description
      ).

*------设置返回参数排列形式 [{"type":"S","message":"Success"}] 这种返回形式看着不方便
    server->response->set_content_type( content_type = 'application/json;charset=UTF-8' ).
*&[
*&{
*&"type": "S",
*&"message": "Success"
*&}
*&]
  ENDMETHOD.

2.sicf配置生成UIL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值