我的 API Connect API 的程序集包含两个调用。首先是调用内部路由 API 来获取一些路由信息。此路由 API 的响应不应传递给第二次调用。
如果我没有在路由 API 的调用中配置“响应对象变量”,则原始请求正文将被覆盖,第二个 API 从路由 API 获取结果作为请求正文。如果我在路由调用中指定一个“响应对象变量”,我将无法在以下步骤中访问该变量的内容(json)。
我该如何解决这个问题?
谢谢 4 帮助。
我的 API Connect API 的程序集包含两个调用。首先是调用内部路由 API 来获取一些路由信息。此路由 API 的响应不应传递给第二次调用。
如果我没有在路由 API 的调用中配置“响应对象变量”,则原始请求正文将被覆盖,第二个 API 从路由 API 获取结果作为请求正文。如果我在路由调用中指定一个“响应对象变量”,我将无法在以下步骤中访问该变量的内容(json)。
我该如何解决这个问题?
谢谢 4 帮助。
您可以稍后在流程中从配置的“响应对象变量”中读取,而不是依赖读取请求对象。例如,如果您的第一个调用将响应对象变量设置为“resp1”,您可以稍后在流程中使用“$(resp1.body)”访问 JSON 有效负载。使用此技术将允许您将每个调用的响应存储在单独的对象中,避免覆盖问题。这些响应对象变量可以像流中的任何其他上下文变量一样被读取。
有关更多信息,请查看知识中心中的这些链接:
我不明白这部分:
[...] “如果我在路由调用中指定一个‘响应对象变量’,我将无法在以下步骤中访问此变量的内容 (json)。” [...]
为什么不能在以下步骤中访问此变量的内容?
...你收到的。我要做的总是将调用中收到的数据的副本保存到已处理的变量中,而不是(原始)原始请求中。
在您的 GatewayScript 中尝试这样的操作:
let objRequest = apim.getvariable("request");
let body = null;
这里我建议你把body(如果是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;