从SCP中的ABAP调用业务规则时出错

2020-08-18 16:33发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们无法从SAP Cloud Platform中的ABAP调用业务规则API。 请注意-使用我们的客户端ID,机密和令牌URL,我们可以从API Business Hub调用它而不会出现问题。

这是我们从ABAP(在Eclipse中)运行它时遇到的错误:

响应:{"错误":"未经授权","错误说明":"需要完全身份验证才能访问此资源"}

这是我们的源代码:

尝试。
         DATA(lo_http_destination)=
              cl_http_destination_provider => create_by_url('https://bpmruleruntime.cfapps.us10.hana.ondemand.com/rules-service/rest/v2/workingset-rule-services')。

         "可用的API端点
         " https://{runtimeurl}/rules-service/rest


         "按目标创建HTTP客户端
         DATA(lo_web_http_client)= cl_web_http_client_manager => create_by_http_destination(lo_http_destination)。


         "使用API​​沙箱的API密钥添加标头
         DATA(lo_web_http_request)= lo_web_http_client-> get_http_request()。
         lo_web_http_request-> set_header_fields(VALUE#(
         (name ='Content-Type'值='application/json')
         (name ='Accept'值='application/json')
         (名称='APIKey'值='我们来自Business Hub的API密钥')
          ))。


         "用于生产性API端点的可用安全方案
         " OAuth 2.0
         lo_web_http_request-> set_text('{" RuleServiceId":"我们的规则服务ID","词汇":[{" ProfitCenterCompanyCode":{" BUKRS":" testCC"," PRCTR":" ourPR"}}}}'')  。


         "设置请求方法并执行请求
         DATA(lo_web_http_response)= lo_web_http_client->执行(if_web_http_client => post)。
         DATA(lv_response)= lo_web_http_response-> get_text()。


       捕获cx_http_dest_provider_error cx_web_http_client_error cx_web_message_error。
         "错误处理
     ENDTRY。


     "取消注释以下行以进行控制台输出;先决条件:代码段是if_oo_adt_classrun〜main的实现
     out-> write(| response:{lv_response} |)。
   终结法。
 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们无法从SAP Cloud Platform中的ABAP调用业务规则API。 请注意-使用我们的客户端ID,机密和令牌URL,我们可以从API Business Hub调用它而不会出现问题。

这是我们从ABAP(在Eclipse中)运行它时遇到的错误:

响应:{"错误":"未经授权","错误说明":"需要完全身份验证才能访问此资源"}

这是我们的源代码:

尝试。
         DATA(lo_http_destination)=
              cl_http_destination_provider => create_by_url('https://bpmruleruntime.cfapps.us10.hana.ondemand.com/rules-service/rest/v2/workingset-rule-services')。

         "可用的API端点
         " https://{runtimeurl}/rules-service/rest


         "按目标创建HTTP客户端
         DATA(lo_web_http_client)= cl_web_http_client_manager => create_by_http_destination(lo_http_destination)。


         "使用API​​沙箱的API密钥添加标头
         DATA(lo_web_http_request)= lo_web_http_client-> get_http_request()。
         lo_web_http_request-> set_header_fields(VALUE#(
         (name ='Content-Type'值='application/json')
         (name ='Accept'值='application/json')
         (名称='APIKey'值='我们来自Business Hub的API密钥')
          ))。


         "用于生产性API端点的可用安全方案
         " OAuth 2.0
         lo_web_http_request-> set_text('{" RuleServiceId":"我们的规则服务ID","词汇":[{" ProfitCenterCompanyCode":{" BUKRS":" testCC"," PRCTR":" ourPR"}}}}'')  。


         "设置请求方法并执行请求
         DATA(lo_web_http_response)= lo_web_http_client->执行(if_web_http_client => post)。
         DATA(lv_response)= lo_web_http_response-> get_text()。


       捕获cx_http_dest_provider_error cx_web_http_client_error cx_web_message_error。
         "错误处理
     ENDTRY。


     "取消注释以下行以进行控制台输出;先决条件:代码段是if_oo_adt_classrun〜main的实现
     out-> write(| response:{lv_response} |)。
   终结法。
 
付费偷看设置
发送
3条回答
骆驼绵羊
1楼 · 2020-08-18 17:04.采纳回答

莎拉,你好

我使用下面的代码来调用已从ABAP部署在云平台上的规则服务。 你能试一下吗? 您将不得不替换代码中指示的某些部分。

 REPORT z_test_http_call。

 CLASS lcl_invoke_cp定义创建公共。
   公共部分。
     类方法:
       主要。
   专用部分。
     分类方法:
       get_client IMPORTING VALUE(iv_url)TYPE字符串
                            VALUE(iv_method)TYPE字符串
                            VALUE(it_header_fields)TYPE tihttpnvp
                            VALUE(iv_content_type)TYPE字符串
                            VALUE(iv_request_body)TYPE字符串
                  返回值(ro_client)TYPE REF到if_http_client,

       send_receive导入值(io_client)类型引用到if_http_client
                    返回值(rv_response)TYPE字符串。
 ENDCLASS。

 类别lcl_invoke_cp实施。
   方法get_client。
     cl_http_client => create_by_url(导出url = iv_url
                                    正在导入client = ro_client)。
     ro_client-> refresh_request()。
     ro_client-> request-> set_version(if_http_request => co_protocol_version_1_1)。
     ro_client-> propertytype_logon_popup = 0。

     "设置方法
     ro_client-> request-> set_method(iv_method)。

     "设置标题
     ro_client-> request-> set_header_fields(it_header_fields)。

     DATA(lo_request)= cl_rest_message_builder => create_http_message_entity(ro_client-> request)。
     lo_request-> set_content_type(iv_media_type = iv_content_type)。
     lo_request-> set_string_data(iv_request_body)。

     "可接受的内容类型
     ro_client-> request-> set_header_field(name = if_http_header_fields => accept
                                           值= cl_fdt_cp_http_client => gc_content_type-appl_json_utf)。

   终结法。

   方法send_receive。
     io_client-> send(例外http_communication_failure = 1
                                    http_invalid_state = 2
                                    http_processing_failed = 3
                                    http_invalid_timeout = 4)。
     IF sy-subrc NE 0。
       写"发送错误"。
     万一。

 *接收
     io_client-> receive(例外http_communication_failure = 1
                                         http_invalid_state = 2
                                         http_processing_failed = 3)。
     IF sy-subrc NE 0。
       写"接收错误"。
     万一。

     rv_response = io_client->响应-> get_cdata()。
   终结法。

   方法主要。
     数据:ls_token的开始,
              access_token TYPE字符串,
            ls_token的结尾。

     DATA(lo_client)= get_client(iv_url ='/oauth/token'" /oauth/token
                                   iv_method = if_http_entity => co_request_method_post"发布
                                   it_header_fields = VALUE#((name = if_http_header_fields => content_type value = if_rest_media_type => gc_appl_www_form_url_encoded)"标题字段
                                                               (name = if_http_header_fields => connection value ='Close'))
                                   iv_content_type = if_rest_media_type => gc_appl_www_form_url_encoded
                                   iv_request_body ='grant_type = client_credentials&client_id = <客户端ID>&client_secret = ')。

     DATA(lv_resp)= send_receive(lo_client)。

     "获取访问令牌
   /ui2/cl_json =>反序列化(导出json = lv_resp
                                更改数据= ls_token)。

     如果ls_token-access_token不是INITIAL。
       清除:lv_resp。
       lo_client = get_client(iv_url ='<运行时URL>/rules-service/rest/v2/workingset-rule-services'"运行时URL的端点
                                         iv_method = if_http_entity => co_request_method_post"发布
                                         it_header_fields = VALUE#((name = if_http_header_fields => content_type value = if_rest_media_type => gc_appl_json)"标题字段
                                                                     (名称= if_http_header_fields =>连接值='关闭')
                                                                     (名称= if_http_header_fields =>授权值= |载体{ls_token-access_token} |))
                                         iv_content_type = if_rest_media_type => gc_appl_json
                                         iv_request_body ='{" RuleServiceId":" "," Vocabulary":[{}]}'')。

       lv_resp = send_receive(lo_client)。
       cl_demo_output => display(lv_resp)。

     万一。

   终结法。
 ENDCLASS。


 选择开始。
   lcl_invoke_cp => main()。
 
Haoba3210
2楼-- · 2020-08-18 16:56

非常感谢Varun!

大简至美
3楼-- · 2020-08-18 16:43

您好,莎拉,
您可以从这些博客中获取提示(blog1 blog2 ),然后将其应用于规则服务:

一周热门 更多>