我们有一个带有两个条件流的api代理:
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>
剩余问题:
答案 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,则可以获取单个匹配产品。