2020-09-05 04:38发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
是否可以使用ABAP程序调用基于令牌的身份验证? 如果有示例代码,请分享。
谢谢
Shenal
您好,申纳尔
是的,有可能。 对于每个Https调用,将有两个调用:一个获得令牌,另一个基于该令牌执行CRUD操作。
获取令牌的示例代码:
METHOD get_token。 数据:lo_http_client类型参考if_http_client。 DATA:响应TYPE字符串, lv_url TYPE字符串。 常量:lv_initial_url TYPE字符串VALUE'<您的API链接>', lv_auth TYPE字符串VALUE'基本<您的授权数据>'。 "通过URL创建HTTP客户端 呼叫方法cl_http_client => create_by_url 出口 网址= lv_initial_url 输入 客户端= lo_http_client 例外情况 arguments_not_found = 1 plugin_not_active = 2 internal_error = 3 其他= 4。 如果sy-subrc <> 0。 "错误处理 万一。 "设置请求方法 lo_http_client-> request-> set_method('GET')。 "添加标题 lo_http_client-> request-> set_header_field(name ='Authorization'value = lv_auth)。 "用于生产性API端点的可用安全方案 " OAuth 2.0 呼叫方法lo_http_client->发送 例外情况 http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 http_invalid_timeout = 4 其他= 5。 如果sy-subrc = 0。 调用方法lo_http_client-> receive 例外情况 http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 其他= 5。 万一。 如果sy-subrc <> 0。 "错误处理 万一。 响应= lo_http_client->响应-> get_cdata()。 GV_TOKEN =响应。 "将令牌保存在全局变量中 ENDMETHOD。
从上述响应中获取令牌并执行Read调用的示例代码:
METHOD get_proof_history。 数据:lo_http_client类型参考if_http_client。 DATA:响应TYPE字符串, lv_url TYPE字符串, lv_auth TYPE字符串, lv_auth2 TYPE字符串。 常量:lv_initial_url TYPE字符串VALUE'<您的API>'。 如果iv_object_id不是INITIAL。 ***获取令牌 类型: 开始进入 access_token TYPE字符串, token_type TYPE字符串, expires_in TYPE n LENGTH 8, 作用域TYPE字符串, jti TYPE字符串, t_entry的结尾。 类型: t_entry_map t_entry的类型排序表,具有唯一键access_token。 数据:m_entries类型t_entry。 数据:lr_instance类型引用至/ui5/cl_json_parser。 创建对象lr_instance。 呼叫方法-> get_token。 如果gv_token不是INITIAL。 "在这里检索您的令牌 /ui2/cl_json =>反序列化( 导出json = gv_token pretty_name =/ui2/cl_json => pretty_mode-camel_case更改数据= m_entries)。 lv_auth2 = m_entries-access_token。 gv_token = gv_token + 17。 CONCATENATE'Bearer'lv_auth2 INTO lv_auth由空格分隔。 "使用令牌值创建您的授权码 万一。 DATA lv_object_id TYPE字符串。 lv_object_id = iv_object_id。 将lv_object_id转换为小写。 CONCATENATE lv_initial_url lv_object_id INTO lv_url。 "附加修订URL和对象ID以获取请求URL "通过URL创建HTTP客户端 呼叫方法cl_http_client => create_by_url 出口 网址= lv_url 输入 客户端= lo_http_client 例外情况 arguments_not_found = 1 plugin_not_active = 2 internal_error = 3 其他= 4。 如果sy-subrc <> 0。 "错误处理 万一。 "设置请求方法 lo_http_client-> request-> set_method('GET')。 "添加标题 lo_http_client-> request-> set_header_field(name ='Accept'value ='application/json')。 lo_http_client-> request-> set_header_field(name ='Authorization'value = lv_auth)。 "用于生产性API端点的可用安全方案 " OAuth 2.0 呼叫方法lo_http_client->发送 例外情况 http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 http_invalid_timeout = 4 其他= 5。 如果sy-subrc = 0。 调用方法lo_http_client-> receive 例外情况 http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 其他= 5。 万一。 如果sy-subrc = 1。 "错误处理 ev_response ='http_communication_failure'。 ELSEIF sy-subrc = 2。 ev_response ='http_invalid_state'。 ELSEIF sy-subrc = 3。 ev_response ='http_processing_failed'。 ELSEIF sy-subrc = 0。 响应= lo_http_client->响应-> get_cdata()。 * WRITE:"响应:",响应。 ev_response =响应。 其他。 ev_response ='未知错误'。 万一。 万一。 ENDMETHOD。
最多设置5个标签!
您好,申纳尔
是的,有可能。 对于每个Https调用,将有两个调用:一个获得令牌,另一个基于该令牌执行CRUD操作。
获取令牌的示例代码:
从上述响应中获取令牌并执行Read调用的示例代码:
一周热门 更多>