从ABAP程序触发SCP

2020-09-11 03:11发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)专家您好, ...

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

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


专家您好,

我正在从ABAP系统触发SCP工作流。 下面是我的代码。 我能够成功获取CSRF令牌值。 但是实际的实例创建没有发生,我收到403 Forbidden错误

注意:我可以使用邮递员触发实例。 因此工作流本身运行正常。

这是我的代码

 *&---------------------------------------------  ------------------------ *
 *&报告Z_TRIGGER_SCP_WORFKLOW
 *&------------------------------------------------  --------------------- *
 *&
 *&------------------------------------------------  --------------------- *
 报告Z_TRIGGER_SCP_WORFKLOW。
 数据:lo_http_client类型参考if_http_client。
 DATA:响应TYPE字符串。
 "通过URL创建HTTP客户端
 " API沙箱的API端点
 呼叫方法cl_http_client => create_by_url
  出口
  url ='https://bpmworkflowruntimeXXXXXea-XXXXX.hana.ondemand.com/workflow-service/rest/v1/xsrf-token'
  输入
  客户端= 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 ='X-CSRF-Token'value ='Fetch')。
 lo_http_client-> request-> set_header_field(name ='Content-Type'value ='application/json')。
 lo_http_client-> request-> set_header_field(name ='Accept'value ='application/json')。
 lo_http_client-> request-> set_header_field(name ='Authorization'value ='Basic XXXXXXXXXXXXXXXXXXXXX')。
 " API沙箱的API密钥
 * lo_http_client-> request-> set_header_field(name ='APIKey'value ='Vw0jBxyASfBvXXXXXXXFbEpcTKxizWKr')。
 "用于生产性API端点的可用安全方案
 "基本身份验证,OAuth 2.0
 "基本身份验证:在授权标头中以Base64提供用户名:密码
 " lo_http_client-> request-> set_header_field(名称='授权'值='基本')。
 呼叫方法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。
  "错误处理
 万一。
 数据:lt_fields类型TIHTTPNVP。
 data(lo_response)= lo_http_client->响应。
 lo_response-> IF_HTTP_ENTITY〜GET_HEADER_FIELDS(CHANGING字段= lt_fields)。
 * cl_demo_output => display(lt_fields)。
 data(ls_fields)= lt_fields [name ='x-csrf-token']。
 data(lv_csrf)= ls_fields-value。
 呼叫方法cl_http_client => create_by_url
  出口
  url ='https://bpmworkflowruntimeaXXXXXX-XXXXX.hana.ondemand.com/workflow-service/rest/v1/workflow-instances'
  输入
  客户端= lo_http_client
  例外情况
  arguments_not_found = 1
  plugin_not_active = 2
  internal_error = 3
  其他= 4。
 如果sy-subrc <> 0。
  "错误处理
 万一。
 "设置请求方法
 lo_http_client-> request-> set_method('POST')。
 "添加标题
 lo_http_client-> request-> set_header_field(name ='X-CSRF-Token'value = lv_csrf)。
 lo_http_client-> request-> set_header_field(name ='Content-Type'value ='application/json')。
 lo_http_client-> request-> set_header_field(name ='Accept'value ='application/json')。
 lo_http_client-> request-> set_header_field(name ='Authorization'value ='Basic XXXXXXXXXXXXXXXXXXXXX')。
 CONCATENATE'{" definitionId":" myworkflowtest",'
  '"上下文":{" PreqItem":" 00010","材料":" 000000000000000011",'
  '" Plant":5000," DelivDate":25082018," PrNumber":""}}'转换成数据(lv_json)。
 呼叫方法lo_http_client-> request-> set_cdata
  出口
  数据= lv_json。
 呼叫方法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()。
 cl_demo_output => display(response)。
5条回答
亦是此间程序员
2020-09-11 03:55 .采纳回答

您似乎在两次通话之间没有传递任何Cookie。 Cookies将获取的令牌上下文化。 没有它们,您将得到403。有关更多详细信息,请参阅此问答。 https://answers .sap.com/questions/563171/why-the-business-rules-invoke-rule-service-need-co.html 干杯!

PS在基本身份验证标头中也具有或多或少的用户名和密码-在基本身份验证标头中,该标头使用Base64编码(易于解码)。 因此,我用Xs替换了一些字符,以便为您遮盖它。

一周热门 更多>