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

本文描述了如何通过使用Http方式从SAP系统发送质检数据到WMS,涉及Json报文格式的转换和SAP内置HttpFM的调用,以及接收和解析WMS的响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做了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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值