http post /json

    CALL METHOD cl_fdt_json=>data_to_json
      EXPORTING
        ia_data = iv_data
      RECEIVING
        rv_json = iv_json.

  CALL METHOD me->http_request
    EXPORTING
      iv_url    = iv_url
      iv_method = 'POST'
      it_header = lt_header
      iv_body   = iv_json
    IMPORTING
      ev_data   = ev_json.

  cl_fdt_json=>json_to_data( EXPORTING iv_json = ev_json CHANGING ca_data = ls_rt ).

封装类方法使用 

value( URL )	TYPE ZE_URL_STR	接口地址
value( METHOD )	TYPE STRING  DEFAULT 'POST'	请求方法
value( USERNAME )	TYPE STRING OPTIONAL	系统账号
value( PASSWORD )	TYPE STRING OPTIONAL	系统密码
value( HEAD )	TYPE STRING OPTIONAL	抬头参数
value( FORM_FIELDS )	TYPE STRING OPTIONAL	输入参数
value( JSON_IN )	TYPE STRING	接口参数
ERROR_MESSAGE	TYPE STRING	输出消息
value( JSON_OUT )	TYPE STRING	输出参数

  METHOD http_send.

    DATA: len          TYPE        i, "发送报文长度
          ls_tihttpnvp TYPE ihttpnvp,
          lt_tihttpnvp TYPE tihttpnvp,
          http_client  TYPE REF TO if_http_client. "http客户端

    "0.获取业务数据/d地址
    "1."创建http客户端
    "2."设定传输请求内容格式以及编码格式
    "3."设置http method 为Get/post
    "4."设置待传输内容长度
    "5."设置调用方法
    "6."设置传入字符串
    "7."发送/捕获异常/接收
    "8.解析处理数据

    "避免中文乱码
    "CALL METHOD cl_http_utility=>escape_url
    "  EXPORTING
    "    unescaped = json_in
    "  RECEIVING
    "    escaped   = json_in.

    "创建http客户端
    CALL METHOD cl_http_client=>create_by_url
      EXPORTING
        url                = url
      IMPORTING
        client             = http_client
      EXCEPTIONS
        argument_not_found = 1
        plugin_not_active  = 2
        internal_error     = 3
        OTHERS             = 4.

    IF username IS NOT INITIAL AND password IS NOT INITIAL.

      "设置用户名密码认证。
      http_client->authenticate( username = username password = password ).

      "添加用户名和密码到消息头。
      http_client->request->set_header_field( name  = 'username'  value = username ).
      http_client->request->set_header_field( name  = 'password'  value = password ).

    ENDIF.

    SPLIT head AT ';' INTO TABLE DATA(lt_head).
    IF sy-subrc EQ 0.
      LOOP AT lt_head INTO  DATA(ls_head)  .
        SPLIT ls_head AT '-' INTO DATA(lv_fname) DATA(lv_value).
        http_client->request->set_header_field( name  = lv_fname  value = lv_value ).
      ENDLOOP.
    ENDIF.

    SPLIT form_fields AT ';' INTO TABLE DATA(lt_form_fields).
    IF sy-subrc EQ 0.
      LOOP AT lt_form_fields INTO  DATA(ls_lt_form_fields)  .
        APPEND INITIAL LINE TO lt_tihttpnvp ASSIGNING FIELD-SYMBOL(<fs_tihttpnvp>).
        SPLIT ls_lt_form_fields AT '-' INTO <fs_tihttpnvp>-name <fs_tihttpnvp>-value.
      ENDLOOP.

      http_client->request->set_form_fields( lt_tihttpnvp[] ).
    ENDIF.

    "设定传输请求内容格式以及编码格式
    http_client->request->set_content_type( content_type = 'application/json;charset=utf-8' ).

    "设置http method
    http_client->request->set_method( method ).

    "设置待传输内容长度
    len = strlen( json_in ).

    "设置传入字符串
    http_client->request->set_cdata( data = json_in  offset = 0  length = len ).

    "发送
    CALL METHOD http_client->send
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3
        http_invalid_timeout       = 4
        OTHERS                     = 5.

    IF sy-subrc NE 0.
      http_client->get_last_error( IMPORTING message = error_message ).
    ENDIF.

    "接收
    CALL METHOD http_client->receive
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3.

    "提取返回字符串
    IF sy-subrc NE 0.
      http_client->get_last_error( IMPORTING message = error_message ).
    ELSE.
      json_out = http_client->response->get_cdata( ).
      IF json_out IS INITIAL.
        error_message = '反馈获取失败'.
      ENDIF.
    ENDIF.

    CALL METHOD http_client->close( ).

    "将字符串中的回车符替换,否则abap将会识别为#
    REPLACE ALL OCCURRENCES OF REGEX '\n' IN json_out WITH space.

    REPLACE ALL OCCURRENCES OF REGEX 'true'  IN json_out WITH `"true"`.
    REPLACE ALL OCCURRENCES OF REGEX 'false' IN json_out WITH `"false"`.

  ENDMETHOD.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值