我正在使用 mule 构建一个安静的代理,我需要在一个流中调用两个 Web 服务。对第一个 WS 的调用应该进行用户身份验证,如果身份验证成功,则原始HTTP 请求将由第二个 WS 调用代理到正确的 REST 端点。第一次身份验证 Web 服务调用返回后,我遇到了问题。当此调用返回时,原始 HTTP 请求将丢失。
如何保留传入的原始 HTTP 请求,将其保存在第一个身份验证 Web 服务调用中,然后在第二个 Web 服务调用之前设置原始标头?
请向我建议实现这一目标的正确方法。
我正在使用 mule 构建一个安静的代理,我需要在一个流中调用两个 Web 服务。对第一个 WS 的调用应该进行用户身份验证,如果身份验证成功,则原始HTTP 请求将由第二个 WS 调用代理到正确的 REST 端点。第一次身份验证 Web 服务调用返回后,我遇到了问题。当此调用返回时,原始 HTTP 请求将丢失。
如何保留传入的原始 HTTP 请求,将其保存在第一个身份验证 Web 服务调用中,然后在第二个 Web 服务调用之前设置原始标头?
请向我建议实现这一目标的正确方法。
在这种情况下,我建议使用浓缩器。
这里的场景看起来第一次调用只是为了进行身份验证。因此使用和丰富器调用第一个 WS 并将响应保存为流变量。
这样,您仍然拥有您的有效负载和所有属性,它们与原始请求中的相同。您可以通过丰富的流变量来决定是否调用第二个 WS。
这是一个示例流程。
<flow>
<http:inbound ... />
...
<enricher target="#[variable:authenticationSuccessful]" source="#[payload]" >
<processor-chain>
<!-- YOu call to first WS and then the status whether authentication is succesful or not.
</processor-chain>
</enricher>
<choice>
<when expression="#[flowVars['authenticationSuccessful']]" />
<http:outbound to second WS />
</when>
<otherwise>
<logger level="INFO" message="Authentication Failed" />
</otherwise>
</choice>
</flow>
希望这可以帮助。
在第一次 Web 服务调用之前将原始请求保存在流变量中。在第一次 Web 服务调用后,将 set-payload 组件拖到流中并从包含原始请求的流变量中为其分配值。
正如 Mohan 建议的那样,将入站属性保存在变量中。Mule 中有两种类型的变量:- 1)流变量 2)会话变量
因此,根据您的要求,如果您想跨传输屏障保留入站属性,请使用 Session 变量,因为它是全局变量,可用于任何流程
另一方面,流变量位于定义它的流的本地。
您可以检查这个以查看如何保存在变量中:- http://www.mulesoft.org/documentation/display/current/Variable+Transformer+Reference
正如 Mohan 和 Anirban 所建议的,您可以使用流变量或会话变量来保持对 HTTP 请求的引用。我建议使用流变量,因为会话变量被序列化并作为消息的一部分发送出去。
您还可以使用丰富器范围使用来自第一个 HTTP 请求的数据“丰富”您当前的 Mule 消息。