本博客是关于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。