SAP ABAP开发技巧-通过URL直接访问外部系统接口

文章详细描述了在ABAP编程中如何通过URL访问外部系统接口,包括建立HTTP连接、设置请求方法(POST或GET)、配置header、发送JSON数据并接收返回消息,最后关闭连接的过程。
摘要由CSDN通过智能技术生成

通过外部系统提供的URL直接访问接口

业务场景:业务完成订单创建时,通过外部系统接口URL实时同步推送数据

主要步骤:

① 建立HTTP连接;

  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = iv_url
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.

② 设置请求方式为:POST/GET;

  "设置请求方式为:POST
  IF iv_request_method = 'POST'.
    CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
  ENDIF.

③ 设置header(如有需要);

  "设置header
  CALL METHOD lo_http_client->request->set_header_fields
    EXPORTING
      fields = it_header_fields.

④ 推送送转换后的json数据;

  "发送转换后的json数据
  CALL METHOD lo_http_client->request->set_cdata( data = iv_json ).
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = if_http_client=>co_timeout_infinite
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      http_invalid_timeout       = 4
      OTHERS                     = 5.

⑤ 接收请求返回消息;

  "接收请求返回消息
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.

⑥ 关闭http连接;

  "关闭http连接
  CALL METHOD lo_http_client->close.

完整代码如下,仅供学习参考

FUNCTION zfm_httpclient_create_by_url.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_URL) TYPE  STRING OPTIONAL
*"     VALUE(IV_REQUEST_METHOD) TYPE  CHAR4 DEFAULT 'POST'
*"     VALUE(IT_HEADER_FIELDS) TYPE  TIHTTPNVP OPTIONAL
*"     VALUE(IV_JSON) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(EV_OUTPUT_JSON) TYPE  STRING
*"     VALUE(ES_MESSAGE) TYPE  ZSNC_RFC_MSG
*"----------------------------------------------------------------------
  TYPES:BEGIN OF ty_ret,
          ret_pk         TYPE string,
          ret_busicode   TYPE string,
          ret_resultcode TYPE string,
          ret_msg        TYPE string,
        END OF ty_ret.

  DATA:lv_url         TYPE string,
       lv_data        TYPE string,
       lo_http_client TYPE REF TO if_http_client.
  DATA: lv_error_msg TYPE string,
        lv_sysubrc   LIKE sy-subrc.

  DATA:ls_ret TYPE ty_ret,
       lt_ret LIKE TABLE OF ls_ret.
  DATA:BEGIN OF ls_ret_msg,
         success    TYPE string,
         data       LIKE lt_ret,
         code       TYPE string,
         message    TYPE string,
         errorStack TYPE string,
       END OF ls_ret_msg.

  lv_url = iv_url.
  CONDENSE lv_url.
  "建立HTTP连接
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = iv_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_error_msg.

    es_message-type = 'E'.
    es_message-message = lv_error_msg.

    RETURN.
  ENDIF.

  "设置请求方式为:POST
  IF iv_request_method = 'POST'.
    CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
  ENDIF.

  IF iv_request_method = 'GET'.
    CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_get ).
  ENDIF.

  "设置header
  CALL METHOD lo_http_client->request->set_header_fields
    EXPORTING
      fields = it_header_fields.

  "发送转换后的json数据
  CALL METHOD lo_http_client->request->set_cdata( data = iv_json ).
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = if_http_client=>co_timeout_infinite
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      http_invalid_timeout       = 4
      OTHERS                     = 5.
      
  "接收请求返回消息
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.

  IF sy-subrc NE 0.
    CALL METHOD lo_http_client->get_last_error
      IMPORTING
        code    = lv_sysubrc
        message = lv_error_msg.

    es_message-type = 'E'.
    es_message-message = lv_error_msg.

  ELSE.
    ev_output_json = lo_http_client->response->get_cdata( ).
  ENDIF.

  "关闭http连接
  CALL METHOD lo_http_client->close.

ENDFUNCTION.
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

混沌破晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值