WSO2 EI/ESB:使用正则表达式实现 Switch mediator 和 Filter mediator
WSO2 EI/ESB: Implementing Switch mediator and Filter mediator using Regular Expression
在我的 API 中,我有一个 属性 像:
<property expression="json-eval($.Entity.users.name)" name="uri.var.name"/>
我想使用 Switch mediator 和 Filter mediator 路由到不同的后端基于上面 属性 .
例如,如果 属性 可以有 4 个不同的值:Nick、Tom、Jade、Dave
如果 属性 的名称为 Nick 或 Jade,它将指向 back-end-1。
如果 属性 的名称为 Tom 或 Dave,它将指向 back-end-2。
<switch source="json-eval(uri.var.name)">
<case regex="Nick|Jade">
<send>
<endpoint>
<http method="get" uri-template="https://backend1.com" />
</endpoint>
</send>
</case>
<case regex="Tom|Dave">
<send>
<endpoint>
<http method="get" uri-template="https://backend2.com" />
</endpoint>
</send>
</case>
<default />
</switch>
这是行不通的。在 Switch mediator 中定义 Source 和 Regex 的正确方法是什么?
同样在过滤中介也!
您在此处对来源使用了错误的表达方式。您正在正确读取名称并使用 JSONPath 表达式将其保存到 属性。请注意这里 json-eval() 表示你在这里使用的是 JSONPath。默认为 XPATH(这就是原因!!!)。
创建 属性 后,属性 将驻留在消息上下文中。要在消息上下文中读取 属性,您需要使用 $ctx:uri.var.name
。 $ctx 表示您正在从消息上下文中读取它。 JSONPath 用于从消息有效负载而不是消息上下文中读取。
根据以上信息,如下更改您的开关调解器。
<switch source="$ctx:uri.var.name">
<case regex="Nick|Jade">
<send>
<endpoint>
<http method="get" uri-template="https://backend1.com" />
</endpoint>
</send>
</case>
<case regex="Tom|Dave">
<send>
<endpoint>
<http method="get" uri-template="https://backend2.com" />
</endpoint>
</send>
</case>
<default />
</switch>
如需参考,请查看以下文档。
https://docs.wso2.com/display/EI660/Accessing+Properties+with+XPath#AccessingPropertieswithXPath-SynapseXPathVariables
https://docs.wso2.com/display/EI660/Working+with+JSON+Message+Payloads+#WorkingwithJSONMessagePayloads-AccessingcontentfromJSONpayloads
在我的 API 中,我有一个 属性 像:
<property expression="json-eval($.Entity.users.name)" name="uri.var.name"/>
我想使用 Switch mediator 和 Filter mediator 路由到不同的后端基于上面 属性 .
例如,如果 属性 可以有 4 个不同的值:Nick、Tom、Jade、Dave
如果 属性 的名称为 Nick 或 Jade,它将指向 back-end-1。
如果 属性 的名称为 Tom 或 Dave,它将指向 back-end-2。
<switch source="json-eval(uri.var.name)">
<case regex="Nick|Jade">
<send>
<endpoint>
<http method="get" uri-template="https://backend1.com" />
</endpoint>
</send>
</case>
<case regex="Tom|Dave">
<send>
<endpoint>
<http method="get" uri-template="https://backend2.com" />
</endpoint>
</send>
</case>
<default />
</switch>
这是行不通的。在 Switch mediator 中定义 Source 和 Regex 的正确方法是什么?
同样在过滤中介也!
您在此处对来源使用了错误的表达方式。您正在正确读取名称并使用 JSONPath 表达式将其保存到 属性。请注意这里 json-eval() 表示你在这里使用的是 JSONPath。默认为 XPATH(这就是原因!!!)。
创建 属性 后,属性 将驻留在消息上下文中。要在消息上下文中读取 属性,您需要使用 $ctx:uri.var.name
。 $ctx 表示您正在从消息上下文中读取它。 JSONPath 用于从消息有效负载而不是消息上下文中读取。
根据以上信息,如下更改您的开关调解器。
<switch source="$ctx:uri.var.name">
<case regex="Nick|Jade">
<send>
<endpoint>
<http method="get" uri-template="https://backend1.com" />
</endpoint>
</send>
</case>
<case regex="Tom|Dave">
<send>
<endpoint>
<http method="get" uri-template="https://backend2.com" />
</endpoint>
</send>
</case>
<default />
</switch>
如需参考,请查看以下文档。 https://docs.wso2.com/display/EI660/Accessing+Properties+with+XPath#AccessingPropertieswithXPath-SynapseXPathVariables https://docs.wso2.com/display/EI660/Working+with+JSON+Message+Payloads+#WorkingwithJSONMessagePayloads-AccessingcontentfromJSONpayloads