restful接口推送公共函数

FUNCTION zfm_restful_send.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_URL) TYPE  STRING
*"     VALUE(IV_METHOD) TYPE  STRING DEFAULT 'POST'
*"     VALUE(IV_USERNAME) TYPE  STRING OPTIONAL
*"     VALUE(IV_PASSWORD) TYPE  STRING OPTIONAL
*"     VALUE(IT_FIELDS) TYPE  TIHTTPNVP OPTIONAL
*"     VALUE(IV_SEND_DATA) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(EV_TYPE) TYPE  BAPI_MTYPE
*"     VALUE(EV_MESSAGE) TYPE  STRING
*"     VALUE(EV_RESPONSE_DATA) TYPE  STRING
*"----------------------------------------------------------------------
  " 接口日志写入
  /afl/log_init.

  TYPES: BEGIN OF ty_response,
           code    TYPE char1,
           message TYPE string,
         END OF ty_response.
  DATA: ls_response TYPE ty_response.

  DATA:lo_http_client TYPE REF TO if_http_client,
       lv_code        TYPE i.
  DATA:lv_proxy_host TYPE string.
  DATA:lv_proxy_service TYPE string.
  DATA: lv_ssl_id TYPE ssfapplssl .
  IF sy-host = 'vhhsgps4ci'.
    lv_proxy_host = 'proxy'.
    lv_proxy_service = '3128'.
  ENDIF.
*创建客户端请求
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                        = iv_url
      proxy_host                 = lv_proxy_host
      proxy_service              = lv_proxy_service
      ssl_id                     = lv_ssl_id
    IMPORTING
      client                     = lo_http_client
    EXCEPTIONS
      argument_not_found         = 1
      plugin_not_active          = 2
      internal_error             = 3
      pse_not_found              = 4
      pse_not_distrib            = 5
      pse_errors                 = 6
      oa2c_set_token_error       = 7
      oa2c_missing_authorization = 8
      oa2c_invalid_config        = 9
      oa2c_invalid_parameters    = 10
      oa2c_invalid_scope         = 11
      oa2c_invalid_grant         = 12
      OTHERS                     = 13.

  IF sy-subrc <> 0.
    ev_type = 'E'.
    lo_http_client->get_last_error( IMPORTING message = ev_message ).
    ev_message = '创建代理失败!' && ev_message.
    RETURN.
  ENDIF.

*不显示登录界面
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.

*设置账号+密码
  IF iv_username IS NOT INITIAL AND iv_password IS NOT INITIAL.
    lo_http_client->authenticate( EXPORTING username = iv_username password = iv_password ).
  ENDIF.

*设定调用服务
  lo_http_client->request->set_method( EXPORTING method = iv_method ).

*设置Headers
  lo_http_client->request->set_header_fields( EXPORTING fields = it_fields[] ).


*设置报文数据
  IF iv_send_data IS NOT INITIAL.
    CALL METHOD lo_http_client->request->set_cdata
      EXPORTING
        data   = iv_send_data
        offset = 0
        length = strlen( iv_send_data ).
  ENDIF.

*发送请求
  CALL METHOD lo_http_client->send
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.
  IF sy-subrc <> 0.
    ev_type = 'E'.
    lo_http_client->get_last_error( IMPORTING message = ev_message ).
    ev_message = '发送请求失败!' && ev_message.
    RETURN.
  ENDIF.

*读取远程服务返回的处理过结果
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.

  IF sy-subrc <> 0 .
    ev_type = 'E'.
    lo_http_client->get_last_error( IMPORTING message = ev_message ).
    ev_message = '获取返回消息失败!' && ev_message.
    RETURN.
  ELSE.
    CALL METHOD lo_http_client->response->get_status
      IMPORTING
        code   = lv_code
        reason = ev_message.

    IF lv_code BETWEEN '200' AND '299'.
      ev_type = 'S'.
      ev_message = '调用接口成功!'.
    ELSE.
      ev_type = 'E'.
      ev_message = '返回码提示失败!' && ev_message.
    ENDIF.

*读取返回内容
    ev_response_data = lo_http_client->response->get_cdata( ).
    IF ev_response_data IS NOT INITIAL.
*      REPLACE ALL OCCURRENCES OF '#' IN ev_response_data WITH space.
*      CONDENSE ev_response_data NO-GAPS.

      /ui2/cl_json=>deserialize( EXPORTING json = ev_response_data
                                 CHANGING  data = ls_response ).
      IF ls_response-code = 1 AND ls_response-message IS NOT INITIAL.
        ev_type = 'E'.
        ev_message = ls_response-message && ev_message.
      ENDIF.
    ENDIF.
  ENDIF.

  lo_http_client->close( ).

  " 保存日志
  /afl/save.

ENDFUNCTION.

 

posted @ 2023-11-10 15:52  ABAP-武汉  阅读(32)  评论(0)    收藏  举报