PI REST Adapter - Custom error handling 例子

本博客是关于SAP PI REST适配器架构概念和配置的一系列博客文章的一部分。我们还添加了一些示例场景,以便您更容易理解如何使用PI REST适配器实现您的场景。

从版本7.31 SP15 / 7.4 SP10开始,我们增强了REST适配器的功能,支持自定义错误处理。您可以维护规则来定义在特定(错误)情况下消息处理应该如何行为。例如,您可能希望忽略特定的错误代码,或者根据消息内容回复自定义消息等。在本博客中,我想向您展示在定义自定义错误处理时的各种选项。

从版本7.31 SP17 / 7.4 SP12 / 7.5 SP01开始,自定义错误处理进一步增强,可以处理无错误发生的情况。引入了以下新功能:

一种新的规则类型“始终”

一个用于反转规则表达式的标志

一种新的规则类型,用于检查消息是否为空

新的变量保存了HTTP属性,这些属性可以在自定义消息中使用。

场景1 - 接收端的自定义错误处理

我想介绍基于REST接收适配器所支持的各种自定义错误处理选项。我配置了一个从SOAP到REST的集成流,该集成流调用了之前博客中场景暴露的REST端点PI REST适配器 - 将功能模块作为RESTful服务暴露。使用该场景中REST发送端的自定义错误处理,我可以模拟各种错误情况。这样,我可以通过比较在Google Chrome浏览器中使用高级REST客户端应用程序或通过额外的SOAP到REST集成流调用RESTful服务时的不同表现,向您展示特定错误情况下的行为。

对于每一个选项,让我们仔细看看适配器类型为REST的接收通道是如何维护的。

自定义错误处理选项

双击类型为REST的接收通道,并切换到“适配器特定”标签下的“错误处理”标签。在这里,您可以定义在运行时验证的规则。对于每条规则,您需要定义一个条件和一个动作。条件通常由一个源和一个值组成,而动作可以是引发错误、忽略错误或用自定义消息回应。

根据HTTP错误情况获取不同的HTTP错误情况并用相应的自定义消息回应

我们希望根据HTTP传输层的特定错误情况返回自定义文本。我定义了两条规则如下:

如果服务调用响应的HTTP状态文本包含短语"Not Found",则用自定义文本 <error>not found</error> 回应。

如果HTTP状态码等于500或503,则用自定义文本 <error>server not reachable</error> 回应。

在任何情况下,HTTP请求都会成功,即HTTP状态码被设置为200。

让我们运行会导致HTTP状态码500的场景。当直接使用高级REST客户端调用REST服务时,我们会得到一个HTTP状态码500 — 内部服务器错误。

当使用soapUI通过SOAP到REST的集成流调用REST服务时,规则会获取到HTTP状态码500,并返回相应的自定义消息。

在消息监控器中,您可以看到消息已被成功处理。添加了一条审计日志记录,显示了所应用的规则及采取的动作。

在发生运行时异常时返回自定义消息。

我们希望每当REST适配器内发生异常时返回一个自定义文本。在我们的例子中,RESTful服务返回了无效的JSON格式,从而导致从JSON到XML的转换失败。我定义了如下规则:对于源异常(Exception),用自定义文本 <error>a validation error occured</error> 进行回应。

如果我们调用RESTful服务而没有定义该规则,消息将进入系统错误状态。从消息监控中的审计日志,您可以看到发生了验证JSON输入的错误。

如果我们使用上述规则调用RESTful服务,消息将成功送达,并以自定义消息作为响应。从审计日志中,您可以看到相应的规则已被应用。

为特定的JSON元素返回自定义消息

如果资源(此处为客户)在后端系统中不存在,则服务调用响应中的字段名将被设置为NONE。我们希望如果JSON元素name的值等于NONE时返回一个自定义文本。因此,我们在下拉菜单中选择JSON表达式作为源。如果JSON元素customer.name匹配表达式NONE,则满足该规则。我们将动作选择为自定义结果。在消息内容中,我们使用了一个大括号内的变量,该变量在运行时将被客户的ID替换。

当使用高级REST客户端调用REST服务时,JSON格式的响应中包含一个名为NONE的元素。

当通过soapUI调用REST服务时,会返回包含从请求URL中提取的ID(此处为76)的相应自定义消息。

为特定的头元素值引发错误

响应应该是JSON格式的。如果返回的是XML,就应该引发一个错误。因此,我们创建了一条规则,其源为HTTP头元素,检查HTTP头元素content-type是否包含application/xml这一项。如果规则匹配,动作应该是引发一个错误。

当使用高级REST客户端调用REST服务时,您可以看到响应是以XML格式而不是JSON格式返回的,并且头元素content-type是application/xml而非application/json。

当通过soapUI调用REST服务时,从消息监控中的审计日志可以看出,相应的规则匹配上了,并且消息被置于错误状态。

对于响应有效负载中的特定文本忽略错误 

在调用REST服务时,如果出现任何超时情况,我们希望忽略这个错误。在这里,我们解析响应的有效负载并查找术语“Timeout”。因此,从下拉菜单中选择“文本内容”作为源,并将“Timeout”作为表达式维护。作为动作,我们从下拉菜单中选择“忽略错误”。

当使用高级REST客户端调用REST服务时,我们得到一个HTTP状态码504——网关超时。在响应的有效负载中,原因被说明为超时。

当通过soapUI调用REST服务时,从消息监控中的审计日志可以看出,相应的规则已被应用,并且消息被置为已送达状态。

注意:以下三个场景仅从版本7.31 SP17 / 7.4 SP12 / 7.5 SP01开始受支持。

如果响应为空则返回自定义消息

如果您选择“文本内容”作为源,您可以定义一个动作,如果HTTP结果为空时。在这里,选择“结果消息为空”的标志。

在发生任何错误时返回自定义消息

我们希望每当HTTP状态码不是200时返回一个自定义消息。该自定义消息应提供有关RESTful调用问题的信息。定义一条具有源HTTP状态码的规则,选择“选择不符合”的标志,并维护状态码200。作为动作选择自定义结果。在消息内容中,您可以使用大括号中的变量http_status和http_status_text。

 在出现HTTP状态码500的情况下,该规则适用,并显示相应的HTTP状态码和文本。

始终忽略错误

如果需要忽略任何错误,您可以定义一条规则,其源为“始终”,并且动作为“忽略错误”。

场景2 - 发送端的自定义错误处理

始终发送HTTP状态码202

从版本7.31 SP17 / 7.4 SP12 / 7.5 SP01开始支持以下场景。

与其发送HTTP状态码200,您希望发送状态码202。因此,在REST发送适配器上创建一条规则,源为“始终”,动作为“自定义结果”,并且HTTP状态码等于202。通过选择“使用消息有效负载”标志,您确保您的响应消息被保留。

当从Chrome浏览器中的高级REST客户端应用程序调用RESTful服务时,您可以看到HTTP状态码已被设置为202。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值