ABAP 接口开发之HTTP传输JSON的封装和解析

最近做了SAP质检同步WMS的接口

需求:将SAP质检的数据同步到WMS

        SAP发送使用Http方式传输Json报文格式.

{
	"data": [
		{
			"STATUS_QI": "1",
			"MAT_DOC": "3151351",
			"CHARG": "23072718053006100",
			"WERKS": "LB",
			"MATNR": "342352",
			"ZWHID": ""
		},
		{
			"STATUS_QI": "2",
			"MAT_DOC": "3151352",
			"CHARG": "230727180530061002",
			"WERKS": "LB",
			"MATNR": "3423523",
			"ZWHID": ""
		}
	]
}

        WMS返回给SAP的报文格式. 

{
    "Response": {
        "return": {
            "returnFlag": "1",
            "returnCode": "0000",
            "returnDesc": "Success"
        }
    }
}

        其实就是将SAP结构转换成Json报文,调用SAP内置的HttpFM将Json发送WMS, 再将WMS回调的JSon报文转换成SAP结构。

        需求的本质还是SAP的结构和Json的互相转换,网上有很多Sap结构转换成Json结构的方法,推荐使用  /ui2/cl_json

        代码:

FORM frm_send_pz.

 DATA lv_send_url  TYPE string.
 DATA io_http_client TYPE REF TO if_http_client.

** 质检同步发送报文结构
  TYPES: BEGIN OF t_data2,
           status_qi TYPE string, "质检标识
           mat_doc   TYPE string, "物料凭证
           charg     TYPE string, "批次
           werks     TYPE string, "工厂
           matnr     TYPE string, "物料
           zwhid     TYPE string, "类型
         END OF t_data2.
  TYPES: tt_data2 TYPE STANDARD TABLE OF t_data2 WITH DEFAULT KEY.

  TYPES: BEGIN OF t_json1,
           data TYPE tt_data2,
         END OF t_json1.
  DATA:lt_send_data TYPE TABLE OF t_data2,
       lw_send_data TYPE t_data2.
  DATA ls_request TYPE t_json1.
** 质检同步WMS接收报文结构
  TYPES: BEGIN OF t_return2,
           return_flag TYPE string,
           return_code TYPE string,
           return_desc TYPE string,
         END OF t_return2.
  TYPES: BEGIN OF t_response3,
           return TYPE t_return2,
         END OF t_response3.
  TYPES: BEGIN OF t_json2,
           response TYPE t_response3,
         END OF t_json2.
  DATA ls_response TYPE t_json2.

** 判断内表中有没有SEL='X'的数据 条件为真返回abap_true 为假返回abap_false
 " 这个内表已经在其他代码块处获取数据了 
  TRY.
      DATA(lv_exist) = xsdbool( line_exists(  gt_pz_data[ sel = 'X' ] ) ).
  ENDTRY.

  IF lv_exist = abap_false.
    MESSAGE '请选择数据' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  " 这个内表已经在其他代码块处获取数据了  
  LOOP AT gt_pz_data INTO gw_pz_data WHERE sel = abap_true.
    IF gw_pz_data-lgort+3(1) = '3'.
      lw_send_data-status_qi = '2'.
    ELSE.
      lw_send_data-status_qi = '1'.
    ENDIF.
    lw_send_data-mat_doc = |{ gw_pz_data-mblnr ALPHA = OUT }|.
    lw_send_data-matnr   = |{ gw_pz_data-ummat ALPHA = OUT }|.
    lw_send_data-charg   = gw_pz_data-umcha.
    lw_send_data-werks   = gw_pz_data-umwrk.
    lw_send_data-zwhid   = 'Z01'.
    APPEND lw_send_data TO lt_send_data.
  ENDLOOP.

  ls_request-data = lt_send_data[].

* 将SAP结构数据转换成JSON数据
  DATA(lv_send_data) = /ui2/cl_json=>serialize( data = ls_request
                                   compress = abap_false
                                pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
*  接口地址
  lv_send_url = ''. "这里填WMS提供的被调用URL

  TRY.
      "创建http客户端并传入URL
      cl_http_client=>create_by_url( EXPORTING url = lv_send_url   IMPORTING client = io_http_client ).

      "设置内容格式和编码格式
      io_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).

      " 设置方法为 post
      io_http_client->request->set_method( if_http_request=>co_request_method_post ).

      "设置传输内容
      io_http_client->request->set_cdata( data = lv_send_data ).

      "发送请求
      io_http_client->send( EXCEPTIONS http_communication_failure = 1
                                       http_invalid_state         = 2  ).
      IF sy-subrc <> 0.
        "发送失败,获取失败原因
        io_http_client->get_last_error( IMPORTING message = DATA(lv_message) code = DATA(lv_code) ).
        CONCATENATE '质检同步WMS失败原因:' lv_message INTO lv_message.
      ENDIF.

      "读取远程服务器响应
      io_http_client->receive( EXCEPTIONS http_communication_failure = 1
                                          http_invalid_state         = 2
                                          http_processing_failed     = 3 ).
      IF sy-subrc <> 0.
        io_http_client->get_last_error( IMPORTING message = DATA(lv_msg) code = DATA(lv_code1) ).
        CONCATENATE '质检同步WMS服务器响应失败原因:'lv_msg INTO lv_msg.
      ENDIF.

      DATA(lv_res) = io_http_client->response->get_cdata( ).
   
      "将Json报文转换成SAP结构
      /ui2/cl_json=>deserialize( EXPORTING json = lv_res
                                           pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                                  CHANGING data = ls_response ).
      IF ls_response-response-return-return_flag = '1'.
        MESSAGE '质检同步WMS成功' TYPE 'S'.
      ELSE.
        MESSAGE '质检同步WMS失败' TYPE 'S' DISPLAY LIKE 'E'.
      ENDIF.
  ENDTRY.
ENDFORM.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP是一种高级编程语言,通常用于SAP系统的开发,它是面向对象的,可扩展的,具有跨平台的特性。而JSON是一种轻量级的数据交换格式,由于它具有易读性,易解析性以及广泛的支持,已经成为Web开发、移动开发等领域的数据传输标准。 对于在SAP系统中使用JSON数据格式的情况,我们需要使用ABAP中的JSON解析器来将JSON数据转化为ABAP内部的数据结构。在ABAP中,有两种常用的JSON解析方式: 1. JSON转换器(SAP内部类型) 这种方式是将JSON字符串转换成SAP内部类型的结构(例如table、structure、string、numeric值等),从而方便我们在ABAP程序中进行后续的操作。 首先需要通过调用兼容JSON的结构描述语言的类,生成兼容JSON语法的文档类型,之后再根据需要的数据结构,利用WRITE_JSON_FILE函数生成JSON数据格式,最后再将JSON数据格式传入PARSE_JSON()函数解析。 利用JSON转换器的方式,我们可以通过简单的语句实现JSON数据与ABAP内部数据的转化,但是由于其复杂的使用方式,这种方法不太适合在大型的应用中使用。 2. JSON解析接口(SAP内置类) 另外一种解析JSON数据的方式是使用SAP内置的JSON解析接口,这种方法比较容易理解和使用,也比较适合在大型的应用中使用。 ABAP中提供了CL_TREX_JSON_PARSER类,它可以处理所有JSON数据结构(例如object、array、value等)并将其转换成ABAP数据类型。利用该类,我们可以轻松地将JSON数据转换为ABAP内部数据结构,同时也能够轻松地将ABAP数据类型转换为JSON数据格式。 总而言之,无论是使用SAP内置的JSON转换器,还是直接在ABAP中使用JSON解析接口,都可以轻松地将JSON数据转换成ABAP内部数据结构,并进行各种操作或者通过HTTP或其他协议与外部系统进行数据交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值