云平台与OData的集成-如何处理传入的$ filter查询参数

2020-08-31 05:05发布

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

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


我们定义了一个iFlow,它公开了OData服务并使用了接收方OData服务。 我们希望允许最终用户使用$ filter查询参数来查询此iFlow OData服务。 我们希望iFlow能够从传入的URL中提取$ filter,并将其传递给接收方OData服务。

我们如何做到这一点?

我们认为解决方案涉及以下内容:

$ {header.filter}在" OData Receiver"连接的"处理"选项卡的"自定义查询选项"字段中

但是我们不知道要使用什么$ {header}属性,也找不到任何能够明确标识可用$ {header}属性的文档。

对此事的任何指导表示赞赏。

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

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


我们定义了一个iFlow,它公开了OData服务并使用了接收方OData服务。 我们希望允许最终用户使用$ filter查询参数来查询此iFlow OData服务。 我们希望iFlow能够从传入的URL中提取$ filter,并将其传递给接收方OData服务。

我们如何做到这一点?

我们认为解决方案涉及以下内容:

$ {header.filter}在" OData Receiver"连接的"处理"选项卡的"自定义查询选项"字段中

但是我们不知道要使用什么$ {header}属性,也找不到任何能够明确标识可用$ {header}属性的文档。

对此事的任何指导表示赞赏。

付费偷看设置
发送
15条回答
黑丝骑士
1楼 · 2020-08-31 05:34.采纳回答

大家好,

好消息! 在Odata发送方通道之后,将以下代码添加到默认groovy脚本中,此问题已解决。

if(uriInfo.getFilter()!= null){

def filter = uriInfo.getFilter()。getExpressionString();

if(odataURI.size()!= 0)

odataURI.append(urlDelimiter);

odataURI.append(" \ $ filter =")。append(filter);

log.logErrors(LogMessage.TechnicalError,"过滤器值:" + filter);

}

此后,将$ {Header.odataURI}添加到OData接收器适配器的查询选项中。


木偶小白
2楼-- · 2020-08-31 05:29

大家好,

请参阅博客 https://blogs.sap.com/2019/08/12/odata-service-in-cpi-for-beginners/#Query

它说明了如何提取每个OData查询选项并将其用作Integration流中的消息头。

BR
Saranya

微wx笑
3楼-- · 2020-08-31 05:49

嗨维伦德拉,

触发iflow时,会创建一个Camel消息对象,这就是通过iflow传递的内容。

有"标头"值,"交换属性"值和消息对象的正文。

您可以使用content修饰符将Header数据和Exchange属性数据从Header值拉到主体中。

在"内容修改器"的"正文"标签中,您可以输入例如;

标题" orderNo"为$ {header.orderNo}

 属性" msgOut"为$ {property.msgOut} 

然后您将它们拉入人体。

1。 "我们认为该解决方案涉及以下内容:$ {header.filter}"

是的,只要消息对象中实际上有一个名为" filter"的标头,然后就可以使用$ {header.filter}来访问它。

2。 "但是,我们不知道要使用什么$ {header}属性,我们找不到任何能够明确标识可用$ {header}属性的文档。"

您可以使用Groovy脚本步骤将所有标头和属性传输到主体,然后根据需要在其中查看它们。 使用我为您创建的以下脚本来完善此功能:

导入com.sap.gateway.ip.core.customdev.util.Message;
 导入java.util.HashMap;
 导入java.util.List;

 def消息processData(消息消息)
 {

//将主体作为字符串获取(由于groovy是动态语言,因此无需类型转换)
 def body_as_string = message.getBody();

//从Message对象获取标头
 def message_headers = message.getHeaders();

//从Message对象获取属性
 def message_properties = message.getProperties();

//创建一个新的字符串以显示在正文中
 def new_body_string =
 ""
 该消息是使用Apache Groovy语言创建的。

 所有标头:$ {message_headers}

 所有属性:$ {message_properties}
 ""

//使用我们现在创建的新字符串设置Message对象的主体
 message.setBody(new_body_string);

 返回消息;
 }

 

您还可以将正文作为附件登录到MPL,然后可以对其进行查看。

此处说明了操作方法: https://blogs.sap.com/2017/01/09/hci-payload-logging-sorted-using-groovy-script /

天桥码农
4楼-- · 2020-08-31 05:46

凯文,你好

以上两个建议仍然给出相同的错误消息。

Climb_Ma
5楼-- · 2020-08-31 05:25

*实际上,这可能是由于原始答案中的导入缺少以下内容引起的:

 import java.util.List; 

我现在已经更新了原始答案,并添加了这个答案。

SAP小菜
6楼-- · 2020-08-31 05:37

嗨,凯文,

我们现在能够将标头和属性的内容转储到日志中,但是,无法从日志中找到负责捕获通过url传递的过滤器值的任何键/变量。 例如,以下是当前OData服务iFlow的标题列表详细信息。

null accept-language en-US,en; q = 0.9,gu; q = 0.8

ODataContext org.apache.olingo.odata2.core.ODataContextImpl@501b8ee3 odataEntity客户ODataMethod GET_FEED odataURI空SAP_MessageProcessingLogID AFy_xY3nU4CZP0GUMwfhjwAyYXip脚本文件script2.gsh脚本文件类型groovy。 -对于50.101.108.120

将过滤器传递给常规HTTP集成流的相同尝试将检索以下标头内容,该内容似乎正确地在标头中传递了过滤器值,因为我们可以看到CeqHttpQuery中捕获了ID eq'RAVAL',如下所示。

空CamelHttpMethod GET CamelHttpPath CamelHttpQuery $ filter = ID%20eq%20%27RAVAL%27 CamelHttpUrl https://c0908-iflmap.hcisb.int.sap.eu2.hana.ondemand.com/http/pogo CamelServletContextPath/pogo SAP_MessageProcessingLogID AFy_bxZ9Qd5hRZKz6n53-3VDJF6c脚本文件 POGO_script.gsh scriptFileType groovy

..想知道如何在OData集成流程中获得像CamelHttpQuery这样的元素。

ZJXianG
7楼-- · 2020-08-31 05:41

您好,Virendra,

最好立即与我们展开事件,以寻求进一步的帮助。

最好的问候

一周热门 更多>