SAP访问外围系统(http/https)
1、308 Permanent Redirect(错误)没解决,如果有高手解决请留言非常感谢交流。
外围系统要改URL访问地址,Postman访问时通的没有任何问题,通过ABAP程序调用报错308 Permanent Redirect,使用SMICM没有查到任何错误,而且找basis查看防火墙都开着没问题。经过沟通对方提供URL地址时一级访问地址(Postman可以自动转接,abap程序不可以),最终外围系统提供一个二级访问URL地址解决了。
2、https访问遇到问题以及解决思路
abap程序访问提示
说明以前有程序用到这个二级URL服务的证书已经导入系统,这个时候我们可以通过URL地址直接浏览器访问一下 提示:no access key, access reject 说明需要加密KEY 访问这时候给第三方要就可以(KEY值 有的外围系统设置有效期,测试机生产机不一样这个一定要和对方确定好,不然传到生产机不能使用),代码header加一下就OK了,name不变 value是变化的
r_client->request->set_header_field( name = 'x-gw-accesskey' value = ‘4f64b33f-e2da-4cd2-9ff4-804a’).
3、http访问错误查找日志(SMICM使用方法)
SMICM主要功能:
a. 监控服务和端口:
SMICM 允许管理员监视系统上的各种服务和端口,确保它们正常运行。这对于确保与外部系统的通信正常进行非常重要。
b. 处理和监控 HTTP 请求:
• 对于运行 SAP Web应用程序服务器的系统,SMICM 提供了监视和处理 HTTP 请求的功能。这有助于检测和解决与 Web 服务相关的问题。
c. 管理网络连接:
• 管理员可以使用 SMICM 查看系统上的当前网络连接,包括连接到 SAP 系统的用户和外部系统之间的连接。这有助于监视系统的负载和性能。
d. SSL/TLS 证书管理:
• 对于启用了安全套接字层(SSL)或传输层安全性(TLS)的系统,SMICM 提供了证书管理功能。这包括查看和更新 SSL/TLS 证书,确保通信的安全性。
e. http 缓存管理:
• 对于运行 Web 应用程序的系统,SMICM 允许管理员管理 HTTP 缓存。这有助于优化 Web 应用程序的性能,并确保用户获得最新的数据。
f. 系统性能监控:
• SMICM 提供了有关系统性能的信息,包括网络延迟和响应时间。这对于识别潜在性能问题并进行相应的调整非常有帮助。
CL_HTTP_CLIENT访问外围系统报错一般使用
CALL METHOD lo_http_client->get_last_error
IMPORTING
code = lv_code
message = err_message.
4、http源代码
DATA: BEGIN OF ls_json,
emp_list TYPE TABLE OF yshr_employee_info, "员工信息
app TYPE string, "传固定值SAP
operator_Id TYPE string, "item信息
END OF ls_json.
DATA: BEGIN OF ls_respond,
code TYPE string,
msg TYPE string,
END OF ls_respond.
***http 接口
DATA: lv_json TYPE string.
DATA:lv_urlpassword TYPE string.
DATA: lv_len TYPE i.
DATA: lv_url TYPE string. "http 服务接口地址
DATA: lr_client TYPE REF TO if_http_client. "HTTP请求
DATA lo_root TYPE REF TO cx_root. "异常
DATA: lv_text TYPE string. "异常文本
***赋值
MOVE-CORRESPONDING it_empinfo TO ls_json-emp_list.
ls_json-app = 'sap'."要小写
ls_json-operator_Id = iv_operator.
CLEAR lv_json.
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = ls_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
RECEIVING
r_json = lv_json.
***获取数据
TRY.
*&_创建http连接
cl_http_client=>create_by_url(
EXPORTING
url = lv_url
IMPORTING
client = lr_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4
).
IF lr_client IS BOUND.
* CALL METHOD lr_client->request->set_method( 'POST' ).
* lr_client->request->set_content_type( content_type = 'application/json; charset=UTF-8' ).
* lr_client->request->set_header_field( name = 'Content-Type' value = 'application/json ; charset=UTF-8' ).
* 设定传输请求内容格式以及编码格式
lr_client->request->set_content_type( content_type = 'application/json; charset=UTF-8' ).
* 设置POST请求
lr_client->request->set_method( if_http_request=>co_request_method_post ).
* 设置传参方式
lr_client->request->set_header_field( name = 'Content-Type' value = 'application/json' ).
lr_client->request->set_header_field( name = 'x-gw-accesskey' value = lv_urlpassword ).
* 设置请求协议:HTTPS
lr_client->request->set_header_field( name = '~request_protocol' value = 'HTTPS/1.1' ).
*& 记录长度
lv_len = strlen( lv_json ).
CALL METHOD lr_client->request->set_cdata
EXPORTING
data = lv_json
offset = 0
length = lv_len.
lr_client->send(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2 ).
lr_client->receive(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3 ).
DATA(lv_result) = lr_client->response->get_cdata( ).
* 解析调用结果
IF lv_result IS NOT INITIAL.
CLEAR ls_respond.
CALL METHOD /ui2/cl_json=>deserialize
EXPORTING
json = lv_result
CHANGING
data = ls_respond.
IF ls_respond-code = '0'.
ev_mtype = 'S'.
ev_msg = ls_respond-msg.
ELSE.
ev_mtype = 'F'.
ev_msg = ls_respond-msg.
ENDIF.
ELSE.
ev_mtype = 'F'.
ev_msg = '请求接口失败'.
ENDIF.
CALL METHOD lr_client->close.
ELSE.
ev_mtype = 'F'.
ev_msg = '请求接口失败'.
ENDIF.
CATCH cx_root INTO lo_root.
lv_text = lo_root->get_text( ).
ev_mtype = 'F'.
ev_msg = lv_text.
ENDTRY.