如何在程序集的以下步骤中访问invoke响应对象变量



我的API Connect API的程序集包含两个调用。第一种是调用内部路由API来获取一些路由信息。此路由API的响应不应传递给第二个调用。

如果我没有在路由API的调用中配置"响应对象变量",则原始请求主体将被覆盖,第二个API将从路由API获得结果作为请求主体。如果我在路由调用中指定了一个"响应对象变量",我就无法在以下步骤中访问该变量的内容(json)。

我该如何解决这个问题?

Thx 4帮助。

您可以稍后在流中读取已配置的"响应对象变量",而不是依赖于读取请求对象。例如,如果您的第一个调用的响应对象变量设置为"resp1",那么您可以稍后在流中使用"$(resp1.body)"访问JSON负载。使用此技术可以将每个调用的响应存储在一个单独的对象中,从而避免覆盖问题。这些响应对象变量可以像流中的任何其他上下文变量一样读取。

有关更多信息,请查看知识中心的以下链接:

调用策略:https://www.ibm.com/support/knowledgecenter/en/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/rapim_ref_ootb_policyinvoke.html

上下文变量:https://www.ibm.com/support/knowledgecenter/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/capim_context_references.html

我不明白这个部分:

[…]"如果我在路由中指定了一个‘响应对象变量’invoke,我无法访问以下步骤。"[…]

为什么不能在以下步骤中访问此变量的内容?


保存请求的副本

您收到的。我要做的是始终将调用中接收到的数据的副本保存到处理过的变量,而不是(原始)原始请求。

在你的GatewayScript中尝试这样的东西:

let objRequest = apim.getvariable("request");
let body = null;

在这里,我建议您将主体(如果是json)更改为标准的js对象

if(objRequest && objRequest.hasOwnProperty("body")){
try{
body = JSON.parse(objRequest.body);
}catch(e){
body = objRequest.body;
}
}

请记住,在将完整对象保存为全局变量之前,先字符串化该对象。是存储它的唯一方法(因为在这类变量中只能存储字符串值)

apim.setvariable("objRequest", JSON.stringify(objRequest));

检索请求的副本

保存在全局变量中的,您可以通过以下方式从您想要的任何其他GatewayScript获取:

let objRequest = JSON.parse(apim.getvariable("objRequest"));

请注意不要将现有名称分配给apim.setvariable(name,value),因为如果使用"request"作为名称而不是"objRequest"(或其他),则将替换原始请求元素,我们不希望发生这种情况。


如果您需要设置或检索状态代码

你可以用

let statusCode = objRequest.body.status.code;

最新更新