ABAP调用API,body使用x-www-form-urlencoded入参示例。

ABAP调用API,body使用x-www-form-urlencoded入参示例。

*&---------------------------------------------------------------------*
*& Report ZUPD_ESB_TOKEN
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZUPD_ESB_TOKEN.

DATA OREF TYPE REF TO CX_ROOT.

DATA:E_MSG              TYPE  STRING,
     E_CODE             TYPE  CHAR1,
     E_DATA             TYPE  STRING,
     E_HTTP_STATUS_CODE TYPE  I.

TRY .

    DATA LV_URL TYPE STRING .

    "根据配置信息,获取URL接口地址
    SELECT SINGLE ZZURL INTO LV_URL
      FROM ZTPAKESBURL
      WHERE ZZURLID  = 'GET_ESB_TOKEN'
        AND ZZCLIENT = SY-MANDT.
    IF SY-SUBRC NE 0.
      WRITE '连接地址获取失败!'.
      RETURN.
    ENDIF.

    "获取账号密码
    DATA:LV_USERNAME TYPE STRING,
         LV_PASSWORD TYPE STRING.
    SELECT SINGLE ZZURL,ZREMARKS
      FROM ZTPAKESBURL
      WHERE ZZURLID  = 'ESB_U_P'
        AND ZZCLIENT = @SY-MANDT
      INTO ( @LV_USERNAME,@LV_PASSWORD ).
    IF SY-SUBRC NE 0.
      WRITE '账号密码获取失败!'.
      RETURN.
    ENDIF.

    DATA: LO_HTTP_CLIENT  TYPE REF TO IF_HTTP_CLIENT.
    "实例化1个 IF_HTTP_CLIENT 的对象得到HTTP_CLIENT
    CL_HTTP_CLIENT=>CREATE_BY_URL(
               EXPORTING URL    = LV_URL                "输入参数
               IMPORTING CLIENT = LO_HTTP_CLIENT ).

    LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED.

    "设置某个特定的header field的值
    LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = '~SERVER_PROTOCOL' VALUE = 'HTTP/1.1').

    "设置某个特定的header field的值
    LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'CONTENT-TYPE' VALUE = 'application/x-www-form-urlencoded; charset=utf-8' ).

    "设置某个特定的header field的值
    LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'ACCEPT' VALUE = '*/*' ).

    "设置http请求的方法GET 或者 POST,默认使用POST
    LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).

*设置入参
    LO_HTTP_CLIENT->REQUEST->SET_FORM_FIELD( NAME = 'userName' VALUE = LV_USERNAME ).

    LO_HTTP_CLIENT->REQUEST->SET_FORM_FIELD( NAME = 'password' VALUE = LV_PASSWORD ).

    "发送数据
    CALL METHOD LO_HTTP_CLIENT->SEND
      EXCEPTIONS
        HTTP_COMMUNICATION_FAILURE = 1
        HTTP_INVALID_STATE         = 2.

    "接收HTTP返回
    CALL METHOD LO_HTTP_CLIENT->RECEIVE
      EXCEPTIONS
        HTTP_COMMUNICATION_FAILURE = 1
        HTTP_INVALID_STATE         = 2
        HTTP_PROCESSING_FAILED     = 3.

    "返回状态校验
    LO_HTTP_CLIENT->RESPONSE->GET_STATUS( IMPORTING CODE = E_HTTP_STATUS_CODE ).
    CASE E_HTTP_STATUS_CODE.
      WHEN 200.

        "返回数据,"获取response中的http的body内容
        E_DATA = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

      WHEN OTHERS.
        E_CODE = 'E'.
        E_MSG = '接口访问失败,返回码:' && E_HTTP_STATUS_CODE .
    ENDCASE.

    "关闭http链接
    CALL METHOD LO_HTTP_CLIENT->CLOSE.

  CATCH CX_ROOT INTO  OREF.
    E_CODE = 'E'.
    E_MSG = OREF->IF_MESSAGE~GET_TEXT( ).
    "关闭http链接
    IF LO_HTTP_CLIENT IS NOT INITIAL.
      CALL METHOD LO_HTTP_CLIENT->CLOSE.
    ENDIF.
ENDTRY.

*业务状态识别
IF E_CODE IS INITIAL.
*JSON数据转为内表数据
  TYPES : BEGIN OF TY_JSON,
            IDENTITYTOKEN TYPE STRING,
            USERID        TYPE STRING,
            STATE         TYPE BOOLE_D,
            USERNAME      TYPE STRING,
          END OF TY_JSON.
  DATA:WA_JSON TYPE TY_JSON.

  CALL METHOD /UI2/CL_JSON=>DESERIALIZE
    EXPORTING
      JSON = E_DATA
*     PRETTY_NAME = ABAP_FALSE
    CHANGING
      DATA = WA_JSON.

  IF WA_JSON-STATE EQ ABAP_TRUE.

    DATA WA_ZTPAKESBURL TYPE ZTPAKESBURL.
    WA_ZTPAKESBURL-ZZURLID = 'ESB_TOKEN'.
    WA_ZTPAKESBURL-ZZCLIENT = SY-MANDT.
    WA_ZTPAKESBURL-ZZURL = WA_JSON-IDENTITYTOKEN.
    WA_ZTPAKESBURL-ZREMARKS = '更新时间' && SY-DATUM && SY-UZEIT.

    MODIFY ZTPAKESBURL FROM WA_ZTPAKESBURL.
    IF SY-SUBRC EQ 0.
      COMMIT WORK AND WAIT.
      E_MSG = 'TOKEN更新成功!当前时间:' && SY-DATUM && SY-UZEIT.
    ELSE.
      ROLLBACK WORK.
      E_MSG = 'TOKEN更新失败!当前时间:' && SY-DATUM && SY-UZEIT.
    ENDIF.

  ELSE.

    E_MSG = E_DATA.

  ENDIF.

ENDIF.

WRITE E_MSG.


关键词: ABAP

网友评论

发表评论