在Azure APIM单次调用中执行多个Send-Request请求
在Azure APIM中实现初始请求后批量发起后续请求并组装结果
核心限制说明
Outbound阶段无法使用<SEND-REQUEST>策略标签,但可以通过APIM的context.SendAsync()方法在C#代码中发起HTTP请求,该方法支持所有策略阶段调用。
解决方案步骤
1. 发起初始请求并存储结果
在Inbound阶段发起初始请求,将响应结果存入APIM变量,方便后续阶段调用:
<INBOUND> <SEND-REQUEST mode="new" response-variable-name="initialResponse" timeout="20" ignore-error="false"> <set-url>https://你的源API地址/初始接口路径</set-url> <set-method>GET</set-method> <!-- 按需添加请求头、参数等配置 --> </SEND-REQUEST> </INBOUND>
2. 在Outbound阶段遍历发起后续请求并组装结果
在Outbound的SET-BODY代码块中,读取初始请求结果,遍历需要补充数据的条目,通过context.SendAsync()发起后续请求,将结果注入初始响应后返回:
<OUTBOUND> <RETURN-RESPONSE> <SET-BODY>@{ // 读取初始请求的响应结果 var initialResponse = context.Variables.GetValueOrDefault<JObject>("initialResponse").Content.As<JObject>(); var items = initialResponse["items"].AsJEnumerable().ToList(); // 并行发起后续请求(提升响应效率) var tasks = items.Select(async item => { var itemId = item["id"].ToString(); // 构造后续请求 var request = new HttpRequestMessage(HttpMethod.Get, $"https://你的源API地址/详情接口/{itemId}"); // 发起请求并获取响应 var response = await context.SendAsync(request, CancellationToken.None); if(response.IsSuccessStatusCode) { var details = JObject.Parse(await response.Content.ReadAsStringAsync()); // 将详情注入初始条目 item["details"] = details; } else { // 处理请求失败的场景 item["details"] = new JObject { ["error"] = "获取详情失败" }; } }); // 等待所有请求完成 Task.WhenAll(tasks).Wait(); // 返回组装后的最终结果 return initialResponse.ToString(); }</SET-BODY> <set-status code="200" reason="OK" /> </RETURN-RESPONSE> </OUTBOUND>
关键注意事项
- 并发控制:并行请求可能触发源API的限流机制,若源API有并发限制,可通过
SemaphoreSlim限制并行任务数量,避免被限流。 - 超时处理:可在构造请求时设置超时时间,或调整APIM全局后端超时配置,防止整体响应超时。
- 异常捕获:建议添加
try-catch块捕获请求过程中的异常,避免单个请求失败导致整个响应中断。 - 网络访问:确保APIM实例能访问后续请求的目标API(若APIM部署在VNet中,需配置对应网络规则)。
内容的提问来源于stack exchange,提问作者GT.
相关产品推荐
相关产品推荐

