如何在以下的汇编步骤中访问调用响应对象变量

时间:2017-02-01 15:20:34

标签: ibm-cloud ibm-datapower apiconnect

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

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

我该如何解决这个问题?

Thx 4帮助。

2 个答案:

答案 0 :(得分:1)

您可以从已配置的'响应对象变量'中读取,而不是依赖于读取请求对象。后来在流程中。例如,如果您的第一次调用将响应对象变量设置为' 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

答案 1 :(得分:0)

我不明白这部分内容:

  

[...]“如果我在路由中指定了“响应对象变量”   调用时,我无法访问该变量的内容(json)   请按照以下步骤操作。“ [...]

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


保存请求的副本...

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

在您的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;
    }
}

在将其保存为全局变量之前,请记住对整个对象进行字符串化。是存储它的唯一方法(因为您只能在这种变量中存储 string 值)

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

正在检索请求的副本...

...您已保存在全局变量中,可以通过以下方式从所需的任何其他GatewayScript中获取它

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

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


如果您需要设置或获取状态代码...

...您可以使用:

let statusCode = objRequest.body.status.code;