CPI:API调用以根据来自第一个API调用的最后一条记录的ID来获取第二组记录

2020-08-15 11:55发布

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

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


专家们,

要求:通过API调用获取发票,并通过调用客户API丰富客户数据,然后通过OData将其发布到ECC。

要退回的发票数限制为100条记录。 我有500多个发票,可以按时间增加。 我应该对API调用使用过滤器,以获取下一组记录,如下所示:

第一次API调用: https://XXXXX.com/v1/invoices ?limit = 100

第二个API调用: https://XXXXX.com/v1/invoices ?limit = 100 和starting_after = {来自第一个API调用的第100个发票ID}

第三个API调用: https://XXXXX.com/v1/invoices ?limit = 100 &starting_after = {第二个API调用中的第100个发票ID}

第四次API调用: https://XXXXX.com/v1/invoices ?limit = 100 ⁡&starting_after = {来自第3个API调用的第100个发票ID}

....第N次通话。

如何在CPI中实现这一目标? 任何指针都会有很大帮助。


尝试的方法:使用//has_more ='true'循环调用。 但是它一次又一次地提取相同的发票,API不支持此发票。

此致

Pavan G

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

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


专家们,

要求:通过API调用获取发票,并通过调用客户API丰富客户数据,然后通过OData将其发布到ECC。

要退回的发票数限制为100条记录。 我有500多个发票,可以按时间增加。 我应该对API调用使用过滤器,以获取下一组记录,如下所示:

第一次API调用: https://XXXXX.com/v1/invoices ?limit = 100

第二个API调用: https://XXXXX.com/v1/invoices ?limit = 100 和starting_after = {来自第一个API调用的第100个发票ID}

第三个API调用: https://XXXXX.com/v1/invoices ?limit = 100 &starting_after = {第二个API调用中的第100个发票ID}

第四次API调用: https://XXXXX.com/v1/invoices ?limit = 100 ⁡&starting_after = {来自第3个API调用的第100个发票ID}

....第N次通话。

如何在CPI中实现这一目标? 任何指针都会有很大帮助。


尝试的方法:使用//has_more ='true'循环调用。 但是它一次又一次地提取相同的发票,API不支持此发票。

此致

Pavan G

付费偷看设置
发送
3条回答
南山jay
1楼 · 2020-08-15 12:27.采纳回答

通过添加一个普通的脚本以及循环过程调用,该问题已得到解决。

Groovy脚本1:

导入com.sap.gateway.ip.core.customdev.util.Message;
 导入java.util.HashMap;
 导入java.time.ZonedDateTime
 导入java.time.ZoneId
 导入java.time.temporal.ChronoUnit
 def消息processData(消息消息){
     map = message.getProperties();
     def查询=" status = open&limit = 100"
     ZonedDateTime midnightToday = ZonedDateTime.now(ZoneId.of(" UTC-8"))。truncatedTo(ChronoUnit.DAYS)
 ZonedDateTime firstOfThisMonth = midnightToday.withDayOfMonth(1)
//ZonedDateTime firstOfNextMonth = firstOfThisMonth.plusMonths(1)

 ZonedDateTime firstDayOfLastMonth = firstOfThisMonth.minusMonths(1);
    //ZonedDateTime lastDayOfLastMonth = firstOfThisMonth.plusMonths(0)-1;
 long timestampLower = firstDayOfLastMonth.toEpochSecond()
 long timestampUpper = firstOfThisMonth.toEpochSecond()

//将时间戳设置为Property
   //message.setProperty(" FDPM",timestampLower);
    //message.setProperty("FDCM",timestampUpper);
     时间= map.get("时间");
     if(时间=='真')
     查询=查询+"&created [gte] =" + timestampLower +"&created [lt] =" + timestampUpper
     值= map.get(" starting_after");
     if(值!=''&&值!= null)
     查询=查询+"☆ting_after =" +值
     message.setProperty(" query",query);
        返回消息;
 } 

Groovy Script2:

导入com.sap.gateway.ip.core.customdev.util.Message;
 导入java.util.HashMap;
 导入groovy.json.JsonSlurper;
 def消息processData(消息消息){
    //身体
     def body = message.getBody(java.lang.String);
     JsonSlurper slurper =新的JsonSlurper()
     def json = slurper.parseText(body)
     for(def d:json.data)
         id = d.id
     def has_more = json.has_more.toString()
    //属性
     message.setProperty(" starting_after",id);
     message.setProperty(" has_more",has_more);
     返回消息;
     } 

iFlow设计:

此致

Pavan G

吹牛啤
2楼-- · 2020-08-15 12:42

你好 Sriprasad Shivaram Bhat

感谢您的回复。


我尝试使用hasMore通过循环过程调用来调用API,因为它告诉更多记录是否要提取,但是在每个循环中它选择了相同的发票。 似乎不支持获取下一组记录属性。

我在运行时配置的"允许的标头"部分中尝试了*,并检查了跟踪,但是找不到任何可用于获取下一个属性的属性。


我正在考虑使用以下方法。

选择100张发票将其存储在DataStore中,然后选择最后一张发票,并使用循环流程调用并使用groovy脚本再次选择最后一张发票,直到hasMore ='false'。

在另一个本地集成过程中,将从数据存储中获取发票以进行进一步处理,并在处理后将其删除。

请让我知道是否可以通过其他任何简单的方法来实现。

关于,

Pavan G

能不能别闹
3楼-- · 2020-08-15 12:40

你好Pavan,

API方面的几个问题是否支持hasMore或任何类似的属性,这些属性表明仍然有更多记录要提取? 如果它绝对支持循环过程调用,那么我建议您将*放在Runtime配置的Allowed headers部分中,并查看它可以基于您可以设计过程的API调用返回哪些头或属性。

致谢

Sriprasad Shivaram Bhat

一周热门 更多>