工具函数 - 调用http

复制代码
FUNCTION ztools_call_http .
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(IP_URL) TYPE  STRING
*"     REFERENCE(IP_BODY) TYPE  STRING OPTIONAL
*"     REFERENCE(IP_METHOD) TYPE  STRING DEFAULT 'POST'
*"  EXPORTING
*"     REFERENCE(V_SUBRC) TYPE  CHAR1
*"     REFERENCE(V_MESSAGE) TYPE  BAPI_MSG
*"     REFERENCE(V_RESPON) TYPE  STRING
*"     REFERENCE(V_XRESPON) TYPE  XSTRING
*"----------------------------------------------------------------------
  DATA lv_message TYPE string.

  CLEAR:lv_message,v_subrc,v_message,v_respon.

  DATA http_client  TYPE REF TO if_http_client.
  DATA lv_url TYPE string.
  lv_url = ip_url.
  IF lv_url IS INITIAL.
    v_subrc = 'E'.
    v_message = 'URL链接为空'.
    RETURN.
  ENDIF.

  "创建客户端请求
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = lv_url
    IMPORTING
      client             = http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
    v_subrc = 'E'.
    IF http_client IS INITIAL.
      v_message = '创建http连接失败!'.
    ELSE.
      http_client->get_last_error( IMPORTING message = lv_message ).
      CONCATENATE '创建http连接失败!' lv_message INTO v_message.
    ENDIF.

    RETURN.
  ENDIF.
  http_client->propertytype_logon_popup = http_client->co_disabled.
  "设定调用服务
  CALL METHOD http_client->request->set_method
    EXPORTING
      method = ip_method.

  "设定传输请求内容格式以及编码格式
  CALL METHOD http_client->request->if_http_entity~set_content_type
    EXPORTING
      content_type = 'application/json; charset=utf-8'.
*  CALL METHOD http_client->request->set_header_field
*    EXPORTING
*      name  = 'Content-Type'
*      value = 'application/JSON;charset=utf-8'.
  IF ip_body IS NOT INITIAL.
    DATA length TYPE i.
    length = STRLEN( ip_body ).
    CALL METHOD http_client->request->set_cdata
      EXPORTING
        data   = ip_body
        offset = 0
        length = length.
  ENDIF.
  "发送请求
  CALL METHOD http_client->send
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.

  IF sy-subrc <> 0.
    http_client->get_last_error( IMPORTING message = lv_message ).
    CONCATENATE '创建http连接失败!' lv_message INTO v_message.
    v_subrc = 'E'.
    RETURN.
  ENDIF.

  "读取远程服务返回的处理过结果。
  CALL METHOD http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
  IF sy-subrc <> 0 .
    http_client->get_last_error( IMPORTING message = lv_message ).

    CONCATENATE '获取返回消息失败!' lv_message INTO v_message.
    v_subrc = 'E'.
    RETURN.
  ELSE.
    "读取返回返回内容
    v_subrc = 'S'.
    v_message = '调用接口成功!'.
    v_respon = http_client->response->get_cdata( ).
    v_xrespon = http_client->response->get_data( ).
  ENDIF.
ENDFUNCTION.

调用:下载URL

复制代码
METHOD downloadurl.
  DATA: lv_url TYPE string,
        lv_method TYPE string,
        lv_json TYPE string.
  DATA:lv_subrc TYPE  char1,
        lv_message  TYPE  bapi_msg,
        lv_respon TYPE  string,
        lv_xrespon  TYPE  xstring.
  DATA ls_web TYPE ztweb_param.
  SELECT SINGLE * INTO ls_web FROM ztweb_param WHERE sys = 'YQZL' AND fun = 'DOWNLOADU'.
  lv_url = ls_web-url.
  lv_method = ls_web-method.

  DATA:BEGIN OF ls_data,
    cust_id TYPE char10,"为财资系统十位集团客户号
    download_no TYPE char30,"下载编号
    trade_type TYPE char30,"交易类型 RECEIPT:回单
  END OF ls_data.

  DATA:BEGIN OF ls_body,
    _data LIKE ls_data,
  END OF ls_body.

  DATA:BEGIN OF ls_res,
    retcode TYPE char4,"返回代码
    retmsg TYPE char512,"返回信息
    downloadurl TYPE char512,"下载URL
    transstate TYPE char10,"交易状态
    transmsg TYPE char100,"交易信息
  END OF ls_res.

  DATA:BEGIN OF ls_respon,
    data LIKE ls_res,
  END OF ls_respon.

  ls_data-download_no = download_no.
  ls_data-cust_id = custid.
  ls_data-trade_type = trade_type.
  ls_body-_data = ls_data.

  lv_json = zcl_json=>serialize( data = ls_body pretty_name  =  'X' ).

  CALL FUNCTION 'ZTOOLS_CALL_HTTP'
    EXPORTING
      ip_url    = lv_url
      ip_body   = lv_json
      ip_method = lv_method
    IMPORTING
      v_subrc   = lv_subrc
      v_message = lv_message
      v_respon  = lv_respon
      v_xrespon = lv_xrespon.
  IF lv_subrc = 'S'.
    zcl_json=>deserialize( EXPORTING json = lv_respon CHANGING data = ls_respon ).
    IF ls_respon-data-retcode EQ '0000'.
      IF ls_respon-data-transstate EQ '0'.
        exp_type = 'S'.
        downloadurl = ls_respon-data-downloadurl.
        exp_msg = '请求成功'.
      ELSE.
        exp_type = 'E'.
        exp_msg = ls_respon-data-transmsg.
      ENDIF.

    ELSE.
      exp_type = 'E'.
      exp_msg = ls_respon-data-retmsg.
    ENDIF.
  ELSE.
    exp_type = lv_subrc.
    exp_msg = lv_message.
  ENDIF.
ENDMETHOD.
相关推荐
BillKu9 分钟前
Java + Spring Boot + Mybatis 实现批量插入
java·spring boot·mybatis
YuTaoShao11 分钟前
Java八股文——集合「Map篇」
java
emo了小猫1 小时前
Mybatis #{} 和 ${}区别,使用场景,LIKE模糊查询避免SQL注入
数据库·sql·mysql·mybatis
有梦想的攻城狮2 小时前
maven中的maven-antrun-plugin插件详解
java·maven·插件·antrun
FreeBuf_3 小时前
最新研究揭示云端大语言模型防护机制的成效与缺陷
网络·安全·语言模型
程序员的世界你不懂4 小时前
Appium+python自动化(八)- 认识Appium- 下章
python·appium·自动化
恸流失5 小时前
DJango项目
后端·python·django
硅的褶皱6 小时前
对比分析LinkedBlockingQueue和SynchronousQueue
java·并发编程
Julyyyyyyyyyyy6 小时前
【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
python·selenium·pycharm·自动化
MoFe16 小时前
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
java·前端·.netcore