如何访问同一端点中的另一个条件流?

时间:2014-04-25 08:08:00

标签: node.js apigee

背景

我们有一个带有两个条件流的api代理:

  • GetAllProducts
  • GetSingleProduct

GetAllProducts从我们的后端服务器获取所有产品。对GetAllProducts的请求缓存了一段时间。

GetSingleProduct不访问我们的后端服务器。它只会访问GetAllProducts以获取所有产品,然后找到单个产品并将其返回。它在节点中执行请求。

问题

GetSingleProduct必须知道api代理的url,我们不想对url进行硬编码。我尝试了以下策略来添加传递给节点服务器的查询字符串参数:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="assign-message-path">
    <DisplayName>Assign Message Path</DisplayName>
    <FaultRules/>
    <Properties/>
    <Add>
        <Headers/>
        <QueryParams>
          <QueryParam name="apiProxyUri">{client.scheme}://{client.host}:{client.port}{message.uri}</QueryParam>
        </QueryParams>
    </Add>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

问题是client.host和client.port是'错误的'。他们设置了一些其他的ip和端口,我真的不知道是什么意思。也许他们是内心的。然而,重要的是它不起作用,但如果我将线路修改为硬编码的主机和端口,它可以工作:

<QueryParam name="apiProxyUri">{client.scheme}://90.123.123.123:9001{message.uri}</QueryParam>

我尝试过的其他事情

我已阅读variable reference page以查找可能会使用的其他变量,但没有运气。我也考虑过使用变量virtualhost.name,但是也没有名为virtualhost.port的变量。


更新剩余问题

我根据Srikanth和Mike Dunker的答案修改了代理。我选择像Srikanth建议的那样(GetAllProducts和GetSingleProduct两个独立的代理流程)。 See current flow for GetSingleProduct here.

提取产品政策xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables async="false" continueOnError="false" enabled="true" name="extract-product">
    <DisplayName>Extract Product</DisplayName>
    <FaultRules/>
    <Properties/>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <JSONPayload>
        <Variable name="product">
            <JSONPath>$.[?(@.id == {main.id})]</JSONPath>
        </Variable>
    </JSONPayload>
    <Source clearPayload="false">response</Source>
    <VariablePrefix>main</VariablePrefix>
</ExtractVariables>

剩余问题:

  1. 当jsonpath与特定产品匹配时,结果是具有单个项目的数组。如何获取项目本身,而不是单个项目的数组?
  2. 当jsonpath与任何产品不匹配时,结果为空数组。在这种情况下,应执行“Fault Invalid Id”步骤。我该如何定义该步骤的条件?

2 个答案:

答案 0 :(得分:1)

如果您的情况与&#34; Call Another API Proxy from one API Proxy in the same organization&#34;相同那不推荐。

如果流在同一个代理中,您可以将GetAllProducts放在目标流中,GetSingleProduct将请求传递给包含GetAllProducts的目标流。

总之,

对于GetAllProducts

代理流 - 无,目标流 - GetAllProducts

对于GetSingleProduct

代理流程 - GetSingleProduct,目标流程 - GetAllProducts(与上面相同的目标终点)

答案 1 :(得分:0)

您的解决方案可以比回调代理更简单(并且表现更好)。

1)使用与GetSingleProduct和GetAllProducts匹配的条件创建单个代理流。

2)代理流请求#1:设置一个变量,指定是否调用GetAllProducts或GetSingleProduct(或者只保存pathsuffix)。这样,当您将GetSingleProduct重写为后端的GetAllProducts时,您将能够在响应中稍后处理GetSingleProduct步骤。

3)代理流请求#2:处理后端请求,就像处理当前设计中的GetAllProducts一样:检查响应缓存,构建GetAllProducts请求,发送它。

4)代理流响应#1:像处理当前设计中的GetAllProducts一样处理后端响应:获取响应,填充响应缓存。

5)代理流响应#2:在接下来的步骤中,如果原始请求是GetSingleProduct,则从响应中提取单个产品(在缓存检查之后)。您只需要为所有GetSingleProduct步骤设置GetSingleProduct条件。

这应该可以让你得到你需要的东西,而不必再打电话。


剩余问题的答案

我认为你不能使用&#34; main.product.length == 0&#34;在您的&#34;故障无效ID&#34;条件,但你可以试试。无论如何,您需要做一些事情来抓住单个项目(剩下的问题#1)。

我可能会根据您的提取变量策略创建一个JavaScript策略。它可以检查main.product数组的长度,如果长度为0则设置一个标志(然后可以用于您的故障规则条件)。如果长度为1,则可以获取单个匹配产品。