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