使用API​​提取工作流实例错误400

2020-09-22 22:50发布

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

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


上下文:

我想使用API​​来获取Workflow-instance,并将状态从运行更改为完成,我这样做的方式是 API集线器。 但是我遇到了错误400,但是我的代码中找不到格式或结构错误。

代码:

 function getWorkflowInstanceId(){
    $ .ajax({
    类型:" GET",
    网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/workflow-instances",
    成功:function(data,statusText,xhr){
 var instanceDetails =数据;
 var ID = instanceDetails [0] .id;
 $ .ajax({
 网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/xsrf-token",
 方法:" GET",
 标头:{
 " Authorization":"基本<...>",
 " X-CSRF-Token":"获取"
 },
 成功:功能(结果,xhr,数据){
 var令牌= data.getResponseHeader(" X-CSRF-令牌");
 $ .ajax({
 网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/task-instances/" + ID,
 方法:" PATCH",
 contentType:" application/json",
 数据:" {\"状态\":\"完成\",\"上下文\":{\" userCreationApproved \":\"" +" true" +" \"}}",
 标头:{
 " X-CSRF-Token":令牌
 },
 成功:function(){
 alert("您的批准已提交!");
 },
 错误:功能(错误){
 alert(error.statusText);
 }
 });
 },
 });
    },
    错误:function(errMsg){
 alert("不起作用" + errMsg);
    },
    contentType:" application/json"
    });
 }

 

在调试器中,我可以毫无错误地获取X-CSRF-Token和ID(workflow-instanceId)。

错误消息:

我在请求内容中找不到结构错误的格式。

所以任何建议对我都会很有帮助。

最诚挚的问候,

Joy Lee

(84.5 kB)

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

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


上下文:

我想使用API​​来获取Workflow-instance,并将状态从运行更改为完成,我这样做的方式是 API集线器。 但是我遇到了错误400,但是我的代码中找不到格式或结构错误。

代码:

 function getWorkflowInstanceId(){
    $ .ajax({
    类型:" GET",
    网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/workflow-instances",
    成功:function(data,statusText,xhr){
 var instanceDetails =数据;
 var ID = instanceDetails [0] .id;
 $ .ajax({
 网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/xsrf-token",
 方法:" GET",
 标头:{
 " Authorization":"基本<...>",
 " X-CSRF-Token":"获取"
 },
 成功:功能(结果,xhr,数据){
 var令牌= data.getResponseHeader(" X-CSRF-令牌");
 $ .ajax({
 网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/task-instances/" + ID,
 方法:" PATCH",
 contentType:" application/json",
 数据:" {\"状态\":\"完成\",\"上下文\":{\" userCreationApproved \":\"" +" true" +" \"}}",
 标头:{
 " X-CSRF-Token":令牌
 },
 成功:function(){
 alert("您的批准已提交!");
 },
 错误:功能(错误){
 alert(error.statusText);
 }
 });
 },
 });
    },
    错误:function(errMsg){
 alert("不起作用" + errMsg);
    },
    contentType:" application/json"
    });
 }

 

在调试器中,我可以毫无错误地获取X-CSRF-Token和ID(workflow-instanceId)。

错误消息:

我在请求内容中找不到结构错误的格式。

所以任何建议对我都会很有帮助。

最诚挚的问候,

Joy Lee

(84.5 kB)
付费偷看设置
发送
5条回答
哎,真难
1楼 · 2020-09-22 23:10.采纳回答

嗨,

您的示例有点混乱,因为在您描述的文本中您要更改工作流实例状态。 但是,在代码中,您首先要阅读工作流实例,但要更新任务实例。

尽管如此,错误请求(400)响应源自您实际上正在传递数组的事实。 任务实例PATCH api仅期望一个简单对象。

最诚挚的问候,

Stefan Henke

jovirus
2楼-- · 2020-09-22 22:59

我有点困惑,因为您向我们展示JavaScript的代码遇到了400错误,但是:

-还有Postman屏幕截图,您将在其中显示错误,那么您在哪个实际情况下会收到错误?

-您说要获取工作流实例,但实际上要对其进行修改,对吧?

-在JavaScript中,您要进行三个调用。 如果在这里经历过400,它将发生在哪个呼叫中?

clasier
3楼-- · 2020-09-22 23:03

嗨,

您传递给端点的结构看起来不错。 我认为可以通过内联" true"值来优化它。 但这没关系。

数据:" {\"状态\":\"已完成\",\"上下文\":{\" userCreationApproved \":\" true \"}}",

您可以检查以下内容吗?

1)任务真的还在吗? 如果您要更新已经完成的任务,还将以http 400错误进行响应,但响应中将显示不同的错误消息。

2)http响应应包含一个logId。 你能提供给我吗? 这将给我一些进一步研究的提示。

顺便说一句,请注意本文中授权标头的粘贴值。 其中可能包含不安全加密的敏感信息。

最好的问候,
Stefan

hengyuye
4楼-- · 2020-09-22 23:22

您好,Stefan,

您实际上明白了这一点。 是的,我弄错了。 我需要工作流实例ID来获取任务实例ID,然后使用任务实例PATCH API更改用户任务实例状态。 (最后我回到正确的方向,多么愚蠢的家伙)。

阅读您的评论后,我更改了密码。 如您所述,PATCH API仅期望一个简单的对象。 我没有传递数组,而不是传递数组的元素。

请在下面找到

获取任务ID:

 function getTaskInstanceId(){
 var taskID;
 $ .ajax({
 类型:" GET",
 异步:" true",
 网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/workflow-instances",
 标头:{
 definitionId:"审批者"
 },
 成功:函数(data1,statusText1,xhr1){
 var instanceID = data1 [0] .id;
 $ .ajax({
 类型:" GET",
 异步:" true",
 网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/task-instances?workflowInstanceId=" + instanceID,
 成功:函数(data2,statusText2,xhr2){
 taskID = data2 [0] .id; //taskId是数组的元素
 alert(" taskID是:" + taskID);
 },
 错误:功能(错误){
 alert("无法获取任务ID!" + error.statusText2);
 }
 });
 },
 错误:功能(错误){
 alert("无法获取工作流实例ID!" + error.statusText1);
 }
 });
 返回taskID;
 } 

调用补丁API:

 function onApprove(){
 var taskId = getTaskInstanceId();
 $ .ajax({
 网址:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/xsrf-token",
 方法:" GET",
 标头:{
 "授权":"基本cDE5NDMwMjkyODQ6TGp5MzMyNTk1",
 " x-csrf-token":"获取"
 },
 成功:函数(结果,xhr,数据){
 var令牌= data.getResponseHeader(" X-CSRF-令牌");
 $ .ajax({
 url:" https://bpmworkflowruntimewfs-p1943029284trial.hanatrial.ondemand.com/workflow-service/rest/v1/task-instances/" + taskId,//async:" false",
 方法:" PATCH",
 contentType:" application/json",
 数据:" {\"状态\":\"完成\",\"上下文\":{\" userCreationApproved \":\"" +" true" +" \"}}",
 标头:{
 " X-CSRF-Token":令牌
 },
 成功:function(){
 alert("您的批准已提交!");
 },
 错误:功能(错误){
 alert("无法在此ajax()中提交taskID");
 }
 });
     },
 错误:function(errMsg){
 alert("不适用于令牌" + errMsg);
 }
     });
 } 

修改后,我仍然遇到相同的问题,尽管我可以获得任务ID,但无法在jQuery.ajax中使用它来调用PATCH API。 然后我在Postman中尝试了一下,但仍然收到关于结构错误的错误400。

在第二个函数中," getTaskInstanceId()"是一个回调函数,但始终在jQuery.ajax运行结束后调用,因此我无法将taskId传递给jQuery.ajax。

如果您有任何建议,请随时回复我。

最诚挚的问候,

Joy Lee

何必丶何苦呢
5楼-- · 2020-09-22 23:21

嗨Stefan,

感谢您的帮助,我解决了问题。

1)调用PATCH API时,不能使用方法:" PATCH"

当我将属性"方法"更改为"类型"时,所有问题都已解决。

 $。ajax({

         ......
 类型:" PATCH",
         ......
       }); 

2)格式异常

对于邮递员中的数据,由于使用[]来包含我的数据,因此出现了错误400。

如果可以帮助您,我想给您日志ID:

 {
     "错误":{
         " code":" bpm.workflowruntime.content.format.invalid",
         " message":"无法解析请求内容,因为它具有意外的格式或结构。",
         " logId":" 02916394-e536-496f-9033-777c6d5cf88a"
     }
 } 

顺便说一句,您能告诉我这些日志ID是什么意思吗? 是否有日志库或其他任何东西?

再次感谢您对敏感信息的建议,我将找到另一种获取令牌的方法:)

最诚挚的问候,

Joy Lee

一周热门 更多>