0

我正在使用 mule 构建一个安静的代理,我需要在一个流中调用两个 Web 服务。对第一个 WS 的调用应该进行用户身份验证,如果身份验证成功,则原始HTTP 请求将由第二个 WS 调用代理到正确的 REST 端点。第一次身份验证 Web 服务调用返回后,我遇到了问题。当此调用返回时,原始 HTTP 请求将丢失。

如何保留传入的原始 HTTP 请求,将其保存在第一个身份验证 Web 服务调用中,然后在第二个 Web 服务调用之前设置原始标头?

请向我建议实现这一目标的正确方法。

4

4 回答 4

1

在这种情况下,我建议使用浓缩器。

这里的场景看起来第一次调用只是为了进行身份验证。因此使用和丰富器调用第一个 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>

希望这可以帮助。

于 2015-03-10T17:47:40.757 回答
0

在第一次 Web 服务调用之前将原始请求保存在流变量中。在第一次 Web 服务调用后,将 set-payload 组件拖到流中并从包含原始请求的流变量中为其分配值。

于 2015-03-10T03:18:32.687 回答
0

正如 Mohan 建议的那样,将入站属性保存在变量中。Mule 中有两种类型的变量:- 1)流变量 2)会话变量

因此,根据您的要求,如果您想跨传输屏障保留入站属性,请使用 Session 变量,因为它是全局变量,可用于任何流程

另一方面,流变量位于定义它的流的本地。

您可以检查这个以查看如何保存在变量中:- http://www.mulesoft.org/documentation/display/current/Variable+Transformer+Reference

于 2015-03-10T03:41:05.780 回答
0

正如 Mohan 和 Anirban 所建议的,您可以使用流变量或会话变量来保持对 HTTP 请求的引用。我建议使用流变量,因为会话变量被序列化并作为消息的一部分发送出去。

您还可以使用丰富器范围使用来自第一个 HTTP 请求的数据“丰富”您当前的 Mule 消息。

于 2015-03-10T09:23:18.577 回答