【问题标题】:How to use dynamic URL in Apigee Service Callout如何在 Apigee 服务标注中使用动态 URL
【发布时间】:2014-10-03 00:21:55
【问题描述】:

这很简单。我需要 Apigee 服务标注 (SC) 中的 <URL> 元素作为动态元素。

例如:<URL>http://{dynamicURL}</URL>

dynamicURL 的位置将在运行时确定,并且每个请求的该值都不同。它将具有完整的目标 URL,例如 (ip:port/abc/orderid/1234)

<HTTPTargetConnection>
<Properties />
<URL>http://{dynamicURL}</URL>
</HTTPTargetConnection>

试过这些:

  • 在 JS 策略中,尝试在上下文中设置 servicecallout.{scpolicyname}.target.url。在这种情况下,只会发送动态的ip:port。缺少 URI /abc/orderid/1234

  • AssignMessage 策略中,创建了一个标头并尝试在诸如request.header.name、{request.header.name} 之类的SC URL 元素中使用它,前面带有$。

    李>
  • AssignMessage 策略中,创建一个变量并尝试在SC 中使用它,例如{dynamicURL},前面带有$

这是一个常见的用例,我相信一定有一个简单的方法可以做到。需要您的帮助。

谢谢,

苏木

【问题讨论】:

    标签: apigee callout dynamic-url


    【解决方案1】:

    您可以结合使用 ServiceCallout 和 AssignMessage 策略。

    您可以在 ServiceCallout 策略本身中设置 ip:port。正如您所指出的,将此设置在&lt;HTTPTargetConnection&gt; 的元素&lt;URL&gt;http://{dynamicURL}&lt;/URL&gt; 中。

    至于 URI 的其余部分,您可以使用 AssignMessage 策略 &lt;Path&gt; 元素。这是一个例子:

    <AssignMessage enabled="true" continueOnError="false" async="false" name="GenerateAuthorizationPayload">
        <FaultRules/>
        <Properties/>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
        <AssignTo createNew="true" type="request"/>
        <Set>
        <Payload contentType="text/xml">
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="urn:sample">
               <soapenv:Header/>
               <soapenv:Body>
                  <v1:Login/>
               </soapenv:Body>
            </soapenv:Envelope>
        </Payload>
        <Path>/abc/orderid/1234</Path>
        <Verb>POST</Verb>
        </Set>
    </AssignMessage>
    

    如果您需要灵活性,您还应该能够在&lt;Path&gt; 标记内放置{variable}

    您将获得动态ip:port/path 的这两个策略的组合。

    【讨论】:

    • 我应该补充一点,在最新发布的 OPDK 中,您可以在实际标注本身中添加 。无需事先单独的 AssignMessage 步骤。此外,标注中的 允许使用变量。 AssignMessage 中的 不翻译变量。
    • 例如:&lt;ServiceCallout async="false" continueOnError="false" enabled="true" name="CalloutBAASConfig"&gt; &lt;DisplayName&gt;CalloutBAASConfig&lt;/DisplayName&gt; &lt;FaultRules/&gt; &lt;Properties/&gt; &lt;Request variable="BAASCalloutRequest"/&gt; &lt;Response&gt;BAAScalloutResponse&lt;/Response&gt; &lt;HTTPTargetConnection&gt; &lt;Properties/&gt; &lt;URL&gt;http://{_BAAS_IP}/1234/{dealerId}&lt;/URL&gt; &lt;/HTTPTargetConnection&gt; &lt;/ServiceCallout&gt;
    【解决方案2】:

    考虑使用目标服务器。它更干净,它们是专门为您刚才描述的目的而设计的。更多细节在this answer

    【讨论】:

    • 感谢您的意见,这是个好主意。在我的例子中,IP:port 会因每个请求而改变。给定一个请求,映射 ip 和 URI 内容。因此,如果被 LB 中的其他服务器而不是特定服务器选择,路由到 LB 将不起作用。但我喜欢这个实现,因为它很干净,只是发现我们已经将它用于不同的用例:)
    猜你喜欢
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多