ABAP 调用http发送数据参考示例

35 篇文章 1 订阅

以下示例是ABAP通过调用http的方式来发送业务数据到其他系统 。

注意:ABAP<=>JSON 我使用了ZUI2_JSON这个类里面的方法。

FUNCTION ZOFSFM001.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IS_HEAD) TYPE  ZOFSS001
*"  EXPORTING
*"     VALUE(EV_TYPE) TYPE  CHAR1
*"     VALUE(EV_MESS) TYPE  BAPIRET2-MESSAGE
*"  TABLES
*"      IT_ITEM STRUCTURE  ZOFSS002 OPTIONAL
*"----------------------------------------------------------------------

  DATA: LS_SO TYPE ZOFSS005.
  DATA: LT_SO TYPE TABLE OF ZOFSS005.
  DATA: LT_ITEM TYPE ZOFSI001,
        LS_ITEM TYPE ZOFSS002.
  DATA: LS_T003 TYPE ZOFST003.
  CONSTANTS:LC_URL TYPE STRING
      VALUE 'http://192.168.197.21:8080/login'.

  DATA: LO_UI2_JSON TYPE REF TO ZUI2_JSON.
  DATA: LV_URL          TYPE STRING.
  DATA: LV_MESS_RETURN  TYPE STRING.
  DATA: LO_HTTP_CLIENT  TYPE REF TO IF_HTTP_CLIENT.
  DATA: LO_CLIENT       TYPE REF TO IF_HTTP_CLIENT.
  DATA: LV_LEN          TYPE I."发送报文长度
  DATA: LV_RESPON       TYPE STRING.
  DATA: LV_SUBRC        TYPE SY-SUBRC.
  DATA: LV_JSON_STR     TYPE STRING. "发送报文
  DATA: LV_MESS TYPE STRING.
  DATA: LV_STATU_RETURN TYPE C.
  DATA: BEGIN OF LS_RES,
        CODE TYPE STRING,
        MSG TYPE STRING,
    END OF LS_RES.
  DATA: BEGIN OF LS_ID,
      USERNAME TYPE STRING,
      PASSWORD TYPE STRING,
    END OF LS_ID.
  DATA: BEGIN OF LS_RES_ID,
        CODE TYPE STRING,
        MSG TYPE STRING,
        TOKEN TYPE STRING,
    END OF LS_RES_ID.


  CLEAR LV_MESS_RETURN.
  CLEAR: LS_ITEM.
  REFRESH LT_ITEM.
  MOVE-CORRESPONDING IS_HEAD TO LS_SO.
  MRC_DELETE_ZERO LS_SO-KUNNR LS_SO-KUNNR.

  LOOP AT IT_ITEM.
    MOVE-CORRESPONDING IT_ITEM TO LS_ITEM.
    MRC_DELETE_ZERO LS_ITEM-MATNR LS_ITEM-MATNR.
    MRC_DELETE_ZERO LS_ITEM-PRCTR LS_ITEM-PRCTR.
    APPEND LS_ITEM TO LT_ITEM.
    CLEAR:IT_ITEM,LS_ITEM.
  ENDLOOP.


  LS_SO-CHILDREN[] = LT_ITEM[].

  APPEND LS_SO TO LT_SO.

  CLEAR LS_T003.
  SELECT SINGLE *
    FROM ZOFST003
    INTO CORRESPONDING FIELDS OF LS_T003
   WHERE ZFUNCT = 'ZOFSFM001'.

  CREATE OBJECT LO_UI2_JSON.

  IF LS_T003-ZURL IS NOT INITIAL.
    LV_URL = LS_T003-ZURL.
    IF LT_SO[] IS NOT INITIAL.
      "创建客户端请求
      CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
        EXPORTING
          URL                = LC_URL
        IMPORTING
          CLIENT             = LO_HTTP_CLIENT
        EXCEPTIONS
          ARGUMENT_NOT_FOUND = 1
          PLUGIN_NOT_ACTIVE  = 2
          INTERNAL_ERROR     = 3
          OTHERS             = 4.
      IF SY-SUBRC NE 0.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            MSGID               = SY-MSGID
            MSGNR               = SY-MSGNO
            MSGV1               = SY-MSGV1
            MSGV2               = SY-MSGV2
            MSGV3               = SY-MSGV3
            MSGV4               = SY-MSGV4
          IMPORTING
            MESSAGE_TEXT_OUTPUT = LV_MESS_RETURN.
      ENDIF.
      LS_ID-USERNAME = 'sap'.
      LS_ID-PASSWORD = '123456'.

      IF LV_MESS_RETURN IS INITIAL.
        CLEAR LV_JSON_STR.

        CALL METHOD ZUI2_JSON=>SERIALIZE
          EXPORTING
            DATA   = LS_ID
          RECEIVING
            R_JSON = LV_JSON_STR.
        REPLACE 'USERNAME' WITH 'username' INTO LV_JSON_STR.
        REPLACE 'PASSWORD' WITH 'password' INTO LV_JSON_STR.
        LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED.

        "设定传输请求内容格式以及编码格式
        LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE( CONTENT_TYPE = 'application/json; charset=utf-8' ).
        "设定调用服务
        LO_HTTP_CLIENT->REQUEST->SET_METHOD( IF_HTTP_REQUEST=>CO_REQUEST_METHOD_POST ).

        "设置待传输内容
        LV_LEN = STRLEN( LV_JSON_STR ).
        CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
          EXPORTING
            DATA   = LV_JSON_STR
            OFFSET = 0
            LENGTH = LV_LEN.

        "发送请求
        LO_HTTP_CLIENT->SEND(  EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                          HTTP_INVALID_STATE         = 2 ).
        IF SY-SUBRC <> 0.
          "操作失败,获取失败原因
          LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESS ).
          LV_MESS_RETURN = LV_MESS.
          LV_STATU_RETURN = 'E'.
          CLEAR LV_MESS.
        ENDIF.

        "读取远程服务返回的处理过结果。
        LO_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                            HTTP_INVALID_STATE         = 2
                                            HTTP_PROCESSING_FAILED     = 3 ).
        IF SY-SUBRC <> 0 .
          LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESS ).
          LV_MESS_RETURN = LV_MESS.
          LV_STATU_RETURN = 'E'.
          CLEAR LV_MESS.
        ELSE.
          "读取返回返回内容
          CLEAR LV_RESPON.
          CLEAR LS_RES_ID.
          LV_RESPON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

          CALL METHOD ZUI2_JSON=>DESERIALIZE
            EXPORTING
              JSON = LV_RESPON
            CHANGING
              DATA = LS_RES_ID.

          LV_MESS_RETURN = LS_RES_ID-MSG.
          IF LS_RES_ID-CODE = '200'.
            LV_STATU_RETURN = 'S'.
          ELSE.
            LV_STATU_RETURN = 'E'.
          ENDIF.
        ENDIF.
        CALL METHOD LO_HTTP_CLIENT->CLOSE.
        EV_TYPE = LV_STATU_RETURN.
        EV_MESS = LV_MESS_RETURN.
      ENDIF.
      CHECK EV_TYPE NE 'E'.

      CLEAR:LV_STATU_RETURN,LV_MESS_RETURN,EV_TYPE,EV_MESS.

      "创建客户端请求
      CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
        EXPORTING
          URL                = LV_URL
        IMPORTING
          CLIENT             = LO_HTTP_CLIENT
        EXCEPTIONS
          ARGUMENT_NOT_FOUND = 1
          PLUGIN_NOT_ACTIVE  = 2
          INTERNAL_ERROR     = 3
          OTHERS             = 4.
      IF SY-SUBRC NE 0.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            MSGID               = SY-MSGID
            MSGNR               = SY-MSGNO
            MSGV1               = SY-MSGV1
            MSGV2               = SY-MSGV2
            MSGV3               = SY-MSGV3
            MSGV4               = SY-MSGV4
          IMPORTING
            MESSAGE_TEXT_OUTPUT = LV_MESS_RETURN.
      ENDIF.
      IF LV_MESS_RETURN IS INITIAL.
        CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
          EXPORTING
            NAME  = 'Authorization'
            VALUE = LS_RES_ID-TOKEN.

        CLEAR LV_JSON_STR.
        CREATE OBJECT LO_UI2_JSON.

        CALL METHOD LO_UI2_JSON->SERIALIZE_INT
          EXPORTING
            DATA   = LT_SO
          RECEIVING
            R_JSON = LV_JSON_STR.

        LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED.

        "设定传输请求内容格式以及编码格式
        LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE( CONTENT_TYPE = 'application/json; charset=utf-8' ).
        "设定调用服务
        LO_HTTP_CLIENT->REQUEST->SET_METHOD( IF_HTTP_REQUEST=>CO_REQUEST_METHOD_POST ).

        "设置待传输内容
        LV_LEN = STRLEN( LV_JSON_STR ).
        CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
          EXPORTING
            DATA   = LV_JSON_STR
            OFFSET = 0
            LENGTH = LV_LEN.

        "发送请求
        LO_HTTP_CLIENT->SEND(  EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                          HTTP_INVALID_STATE         = 2 ).
        IF SY-SUBRC <> 0.
          "操作失败,获取失败原因
          LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESS ).
          LV_MESS_RETURN = LV_MESS.
          LV_STATU_RETURN = 'E'.
          CLEAR LV_MESS.
        ENDIF.

        "读取远程服务返回的处理过结果。
        LO_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                            HTTP_INVALID_STATE         = 2
                                            HTTP_PROCESSING_FAILED     = 3 ).
        IF SY-SUBRC <> 0 .
          LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESS ).
          LV_MESS_RETURN = LV_MESS.
          LV_STATU_RETURN = 'E'.
          CLEAR LV_MESS.
        ELSE.
          "读取返回返回内容
          CLEAR LV_RESPON.
          CLEAR LS_RES.
          LV_RESPON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

          CALL METHOD ZUI2_JSON=>DESERIALIZE
            EXPORTING
              JSON = LV_RESPON
            CHANGING
              DATA = LS_RES.

          LV_MESS_RETURN = LS_RES-MSG.
          IF LS_RES-CODE = '200'.
            LV_STATU_RETURN = 'S'.
          ELSE.
            LV_STATU_RETURN = 'E'.
          ENDIF.
        ENDIF.
        CALL METHOD LO_HTTP_CLIENT->CLOSE.
        EV_TYPE = LV_STATU_RETURN.
        EV_MESS = LV_MESS_RETURN.
      ELSE.
        EV_TYPE = 'E'.
        EV_MESS = LV_MESS_RETURN.
      ENDIF.
    ELSE.
      EV_TYPE = 'E'.
      EV_MESS = '请先配置接口发送地址'.
    ENDIF.
  ENDIF.

ENDFUNCTION.

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Java类库JFreeChart绘制折线图并通过RFC接口传递给ABAP程序的示例代码: Java端代码: ```java import java.awt.Color; import java.awt.Font; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.RectangleInsets; public class LineChart { public static byte[] generateChart() throws Exception { // 创建数据集 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(212, "S1", "2016"); dataset.addValue(504, "S1", "2017"); dataset.addValue(1520, "S1", "2018"); dataset.addValue(1845, "S1", "2019"); dataset.addValue(2190, "S1", "2020"); // 创建折线图对象 JFreeChart chart = ChartFactory.createLineChart("Sales Volume", // 图表标题 "Year", // x轴标签 "Volume", // y轴标签 dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方向 true, // 是否显示图例 true, // 是否显示提示 false // 是否生成URL链接 ); // 设置折线图属性 chart.setBackgroundPaint(Color.WHITE); chart.setBorderVisible(false); chart.setAntiAlias(true); chart.setTextAntiAlias(true); chart.getTitle().setFont(new Font("宋体", Font.BOLD, 16)); chart.setPadding(new RectangleInsets(5, 5, 5, 5)); CategoryPlot plot = (CategoryPlot) chart.getPlot(); plot.setBackgroundPaint(Color.WHITE); plot.setRangeGridlinePaint(Color.LIGHT_GRAY); plot.setDomainGridlinePaint(Color.LIGHT_GRAY); plot.setAxisOffset(new RectangleInsets(5, 5, 5, 5)); plot.setOutlineVisible(false); // x轴属性 CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12)); domainAxis.setLabelFont(new Font("宋体", Font.BOLD, 14)); domainAxis.setLowerMargin(0.02); domainAxis.setUpperMargin(0.02); domainAxis.setCategoryMargin(0.1); // y轴属性 NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12)); rangeAxis.setLabelFont(new Font("宋体", Font.BOLD, 14)); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); rangeAxis.setAutoRangeIncludesZero(true); rangeAxis.setLowerBound(0); rangeAxis.setUpperBound(2500); // 折线图渲染器 LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer(); renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); renderer.setSeriesPaint(0, new Color(179, 54, 35)); renderer.setSeriesShapesVisible(0, true); renderer.setSeriesLinesVisible(0, true); // 将折线图保存为图片 BufferedImage bi = chart.createBufferedImage(700, 400); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bi, "png", baos); return baos.toByteArray(); } public static void main(String[] args) throws Exception { generateChart(); } } ``` 将该代码打包成Java库,并将其注册到SAP系统中。 ABAP端代码: ```abap REPORT ztest_jfreechart. * 调用Java端的RFC函数 DATA: lv_java_conn TYPE REF TO cl_jco_destination, lv_function TYPE REF TO if_jco_function, lv_result TYPE REF TO cx_root. TRY. lv_java_conn = cl_jco_destination_manager=>get_destination( 'JAVA_SERVER' ). lv_function = lv_java_conn->get_function( 'com.example.LineChart.generateChart' ). lv_function->execute( ). CATCH cx_jco_exception INTO lv_result. MESSAGE lv_result->get_text( ) TYPE 'E'. ENDTRY. * 获取返回值 DATA: lv_image TYPE xstring. lv_function->get_export_parameter( 'RETURN' )->get( CHANGING lv_image ). * 将返回值保存为PNG图片 DATA: lv_file TYPE string. lv_file = '/tmp/chart.png'. OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE. TRANSFER lv_image TO lv_file. CLOSE DATASET lv_file. * 显示PNG图片 CALL FUNCTION 'WDY_BITMAP_FROM_FILE' EXPORTING filename = lv_file EXCEPTIONS cancelled = 1 file_not_fou = 2 wrong_format = 3 others = 4. ``` 该ABAP程序通过RFC接口调用Java端的RFC函数,获取绘制好的折线图,并将其保存为PNG图片,并通过SAP内置函数`WDY_BITMAP_FROM_FILE`显示在屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值