SAP调用API

SAP调用启信宝API

API信息如下图

代码如下

FUNCTION zfm_http_api_gszm.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_KEYWORD) TYPE  STRING
*"  EXPORTING
*"     REFERENCE(E_STATUS) TYPE  CHAR1
*"     REFERENCE(E_MESSAGE) TYPE  STRING
*"----------------------------------------------------------------------
  DATA: lv_url TYPE string,
        lv_result TYPE string.
  DATA: lo_http_client TYPE REF TO if_http_client, "http客户端
        lt_http_header TYPE tihttpnvp,             "http头部信息
        ls_http_header TYPE ihttpnvp,
        lv_sign       TYPE string,
        lv_md5_hash   TYPE string,
        lv_md5_hash_lower TYPE string
        .
  DATA: lv_abap_timestamp TYPE sytabix, "timestampl,
        lv_unix_timestamp TYPE string,
        lv_unix TYPE string.
  DATA:date LIKE sy-datum.
  DATA:time LIKE sy-uzeit.
  DATA lv_message TYPE string.

  DATA: lv_query   TYPE string,
        lv_len    TYPE i.

  DATA l_json_data TYPE string.

  DATA:BEGIN OF ls_response,
       status     TYPE string,          "状态
       sign       TYPE string,          "数据签名
       message    TYPE string,          "错误提示文本
       data       LIKE ls_data,         "数据表    (看你自己)
     END OF ls_response.

  date = '19700101'.
  time = '080300'.

  CALL FUNCTION 'SWI_DURATION_DETERMINE'
    EXPORTING
      start_date       = date
      end_date         = sy-datum
      start_time       = time
      end_time         = sy-uzeit
    IMPORTING
      duration         = lv_abap_timestamp.
  lv_unix_timestamp = lv_abap_timestamp && '000'.

  lv_url = 'https://api.qixin.com/APIService/enterprise/getBasicInfo'.
  "根据URL生成HTTP代理
  CALL METHOD cl_http_client=>create_by_url(
    EXPORTING
      url    = lv_url
    IMPORTING
      client = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4
      ).
  IF sy-subrc NE 0.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        msgid               = sy-msgid
        msgnr               = sy-msgno
        msgv1               = sy-msgv1
        msgv2               = sy-msgv2
        msgv3               = sy-msgv3
        msgv4               = sy-msgv4
      IMPORTING
        message_text_output = lv_message.

    e_status = 'E'.
    e_message = lv_message.

    RETURN.
  ENDIF.
  "设置HTTP版本
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).
  lo_http_client->propertytype_logon_popup = lo_http_client->co_enabled.
  "设置请求方法
  lo_http_client->request->set_method( if_http_entity=>co_request_method_get ).  "get
*  lo_http_client->request->set_method( if_http_entity=>co_request_method_post ).  "post

*  CALL METHOD lo_http_client->request->set_header_field
*    EXPORTING
*      name  = '~server_protocol'
*      value = 'HTTP/1.1'.
*  "设定传输请求内容格式以及编码格式
*  CALL METHOD lo_http_client->request->set_header_field
*    EXPORTING
*      name  = 'Content-Type'
*      value = 'text/json; charset=utf-8'.

  "请求参数
  lo_http_client->append_field_url(
      exporting
        name  = 'keyword'
        value = i_keyword
      changing
        url = lv_url
        ).
  cl_http_utility=>set_request_uri(
    exporting
      request = lo_http_client->request
      uri     = lv_url    
      ).

  "设置头部
  CLEAR ls_http_header.
  ls_http_header-name  = 'Auth-Version'.
  ls_http_header-value = '2.0'.
  APPEND ls_http_header TO lt_http_header.

  CLEAR ls_http_header.
  ls_http_header-name  = 'appkey'.
  ls_http_header-value = '******************'.  "自己去申请
  APPEND ls_http_header TO lt_http_header.

  CLEAR ls_http_header.
  ls_http_header-name  = 'timestamp'.
  ls_http_header-value = lv_unix_timestamp.     "时间戳
  APPEND ls_http_header TO lt_http_header.

  lv_sign = 'appkey(自己去申请)' && lv_unix_timestamp && '这个也是,和appkey在一块'.  
  CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
    EXPORTING
      alg            = 'MD5'
      data           = lv_sign
    IMPORTING
      hashstring     = lv_md5_hash
    EXCEPTIONS
      internal_error = 1
      OTHERS         = 2.
  TRANSLATE lv_md5_hash TO LOWER CASE.
  lv_md5_hash_lower = lv_md5_hash.

  CLEAR ls_http_header.
  ls_http_header-name  = 'sign' .
  ls_http_header-value = lv_md5_hash_lower.
  APPEND ls_http_header TO lt_http_header.

  CALL METHOD lo_http_client->request->set_header_fields
    EXPORTING
      fields = lt_http_header.

  "发送http请求
  CALL METHOD lo_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 <> 0.
    lo_http_client->get_last_error( IMPORTING message = lv_message ).
    e_message = lv_message.
    e_status = 'E'.
    MESSAGE '发送请求失败!' TYPE 'S' DISPLAY LIKE 'W'.
    RETURN.
  ENDIF.

  "接受HTTP请求
  CALL METHOD 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 ).
    e_message = lv_message.
    e_status = 'E'.
    MESSAGE '获取返回消息失败!' TYPE 'S' DISPLAY LIKE 'W'.
    RETURN.
  ENDIF.
  CLEAR lv_result.
  lv_result = lo_http_client->response->get_cdata( ).
  "关闭HTTP链接
  CALL METHOD lo_http_client->close.

  "解析JSON
  /ui2/cl_json=>deserialize( EXPORTING json = lv_result
                                       pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                             CHANGING data = ls_response
                                ).
  BREAK-POINT.
  

ENDFUNCTION.

调用API会有SSL检查,会报500 SSL Peer错误,这时我们需要向SAP导入证书

先在网站下载证书

启信开放平台-让数据更智能 (qixin.com),按F12

证书导出后,进入STRUST 事务代码,导入证书

然后重启一下ICM就好了

证书就导入成功了

如果还报错404那说明是

1.数据格式或者程序代码问题。

2.另外需要找服务器管理员,在SAP服务器能不能PING 通接口地址,可能需要设置DNS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值