ABAP 调用第三方http接口

HTTP和HTTPS接口的区别在于,HTTPS 的外部接口调用需要先用STRUST去打一下对方的证书

以下是HTTP接口的示例

 TYPES: BEGIN OF TY_TOKEN,
           USERNAME TYPE STRING,
           PASSWORD TYPE STRING,
         END OF TY_TOKEN.
  TYPES: BEGIN OF TY_TOKEN_RES,
           REQUESTID TYPE STRING,
           MESSAGE   TYPE STRING,
           BODY      TYPE STRING,
           CODE      TYPE STRING,
         END OF TY_TOKEN_RES.
  DATA: LS_TOKEN_RES   TYPE TY_TOKEN_RES.
  DATA: LS_TOKEN       TYPE TY_TOKEN.
  DATA: LV_RES_JSON    TYPE STRING.
  DATA: LV_TOKEN_JSON  TYPE STRING.
  DATA: LV_TOKEN_URL   TYPE STRING.
  DATA: LV_REQ_URL     TYPE STRING.
  DATA: LS_ZCA_URL     TYPE ZCA_URL.
  DATA: LT_ZCA_URL     TYPE STANDARD TABLE OF ZCA_URL.
  DATA: LO_HTTP_CLIENT  TYPE REF TO IF_HTTP_CLIENT .
  DATA: LV_LEN          TYPE I.
  DATA: LV_MESSAGE      TYPE STRING.
  DATA: LV_TOKEN        TYPE STRING.
  DATA: LV_REQ_JSON     TYPE STRING
  DATA: EV_MESSAGE      TYPE STRING
  DATA: EV_RES_JSON     TYPE STRING.

  SELECT  *
  FROM ZCA_URL
  INTO TABLE LT_ZCA_URL
  WHERE ZSYSTEM = '2'
  AND   SYSTEM_SAP = SY-MANDT.
  IF SY-SUBRC NE 0.
    EV_MESSAGE =  'Please maintain the url first!'.
    RETURN.
  ENDIF.

  READ TABLE LT_ZCA_URL INTO LS_ZCA_URL
  WITH KEY   INTERFACEID = 'I01'.
  IF SY-SUBRC NE 0.
    EV_MESSAGE = 'Please maintain the token url first!' .
    RETURN.
  ENDIF.
  "这里是获取toekn
  LV_TOKEN_URL = LS_ZCA_URL-URL.
  LS_TOKEN-USERNAME = LS_ZCA_URL-ACCOUNT.
  LS_TOKEN-PASSWORD = LS_ZCA_URL-PASSWORD.

  LV_TOKEN_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ). "设置小写

  "创建客户端请求
  CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
    EXPORTING
      URL                = LV_TOKEN_URL
    IMPORTING
      CLIENT             = LO_HTTP_CLIENT
    EXCEPTIONS
      ARGUMENT_NOT_FOUND = 1
      PLUGIN_NOT_ACTIVE  = 2
      INTERNAL_ERROR     = 3
      OTHERS             = 4.
  IF SY-SUBRC <> 0.
    EV_MESSAGE =  'Get token error!' .
    RETURN.
  ENDIF.

  "设定传输请求内容格式以及编码格式
  LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE( CONTENT_TYPE = 'application/json; charset=utf-8' ).

  "设定调用服务
  LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).
  "设置待传输内容
  LV_LEN = STRLEN( LV_TOKEN_JSON ).

  CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
    EXPORTING
      DATA   = LV_TOKEN_JSON
      OFFSET = 0
      LENGTH = LV_LEN.
  "发送请求
  LO_HTTP_CLIENT->SEND(  EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                    HTTP_INVALID_STATE         = 2 ).
  IF SY-SUBRC <> 0.
    "操作失败,获取失败原因
    LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
    EV_MESSAGE =  LV_MESSAGE .
    RETURN.
  ENDIF.

  "读取远程服务返回的处理过结果。
  LO_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                      HTTP_INVALID_STATE         = 2
                                      HTTP_PROCESSING_FAILED     = 3 ).
  IF SY-SUBRC <> 0 .
    LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
    EV_MESSAGE =  LV_MESSAGE .
    RETURN.
  ELSE.
    "读取返回返回内容
    CLEAR LV_RES_JSON.
    LV_RES_JSON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
** deserialize JSON string json into internal table lt_flight doing camelCase to ABAP like field name mapping
    /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON        = LV_RES_JSON
                                         PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE
                                CHANGING DATA        = LS_TOKEN_RES ).
    LV_TOKEN = LS_TOKEN_RES-BODY.
    IF LV_TOKEN IS INITIAL .
      EV_MESSAGE = 'Get token error!'  .
      RETURN.
    ENDIF.
  ENDIF.

  CLEAR:LS_ZCA_URL.
  READ TABLE LT_ZCA_URL INTO LS_ZCA_URL
  WITH KEY   INTERFACEID = 'I02'.
  IF SY-SUBRC NE 0.
    EV_MESSAGE = 'Please maintain the invoice url first!' .
    RETURN.
  ENDIF.

  LV_REQ_URL = LS_ZCA_URL-URL.


  "开始传输数据
  "创建客户端请求
  CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
    EXPORTING
      URL                = LV_REQ_URL
    IMPORTING
      CLIENT             = LO_HTTP_CLIENT
    EXCEPTIONS
      ARGUMENT_NOT_FOUND = 1
      PLUGIN_NOT_ACTIVE  = 2
      INTERNAL_ERROR     = 3
      OTHERS             = 4.
  IF SY-SUBRC <> 0.
    IF LO_HTTP_CLIENT IS NOT INITIAL .
      CALL METHOD LO_HTTP_CLIENT->GET_LAST_ERROR
        IMPORTING
          MESSAGE = LV_MESSAGE.
      EV_MESSAGE =  LV_MESSAGE .
      RETURN.
    ENDIF .
    RETURN.
  ENDIF.

  CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
    EXPORTING
      NAME  = 'Authorization'
      VALUE = LV_TOKEN.

  "设定传输请求内容格式以及编码格式
  LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE( CONTENT_TYPE = 'application/json; charset=utf-8' ).

  "设定调用服务
  LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).
  "设置待传输内容
  LV_LEN = STRLEN( LV_REQ_JSON ).

  CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
    EXPORTING
      DATA   = LV_REQ_JSON
      OFFSET = 0
      LENGTH = LV_LEN.
  "发送请求
  LO_HTTP_CLIENT->SEND(  EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                    HTTP_INVALID_STATE         = 2 ).
  IF SY-SUBRC <> 0.
    "操作失败,获取失败原因
    LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
    EV_MESSAGE =  LV_MESSAGE .
    RETURN.
  ENDIF.

  "读取远程服务返回的处理过结果。
  LO_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
                                      HTTP_INVALID_STATE         = 2
                                      HTTP_PROCESSING_FAILED     = 3 ).
  IF SY-SUBRC <> 0 .
    LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
    EV_MESSAGE =  LV_MESSAGE .
    RETURN.
  ELSE.
    "读取返回返回内容
    CLEAR LV_RES_JSON.
    LV_RES_JSON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

    SEARCH LV_RES_JSON FOR 'success'.
    IF SY-SUBRC = 0.
      EV_RES_JSON = LV_RES_JSON.
    ELSE.
    EV_MESSAGE = 'Send data failed'.
    ENDIF.
  ENDIF.

1.如何设置请求字段NAME的大小写,或者驼峰命名法

  TYPES: BEGIN OF TY_TOKEN,
           USERNAME TYPE STRING,
           PASSWORD TYPE STRING,
         END OF TY_TOKEN.
  DATA: LS_TOKEN       TYPE TY_TOKEN.
  TYPES: BEGIN OF TY_TOKEN_CAMEL,
           USER_NAME TYPE STRING,
           PASS_WORD TYPE STRING,
         END OF TY_TOKEN_CAMEL.
  DATA: LS_TOKEN_CAMEL   TYPE TY_TOKEN.
DATA: LV_UP_JSON TYPE STRING.
    "name 大写
    LV_UP_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN ASSOC_ARRAYS = ABAP_TRUE ).
    "name 小写
     LV_TOKEN_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN 
                          PRETTY_NAME =  /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ). "设置小写 
     "name CAMEL
     LV_TOKEN_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN_CAMEL
                          PRETTY_NAME =  /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ). "设置驼峰
    "userName passWord 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值