在APIM调用Azure Table Storage时,如何存储set-backend-service响应并自定义JSON?
解决APIM中捕获Azure表存储响应并自定义JSON结构的问题
当前策略仅能完成XML到JSON的直接转换,无法对后端响应内容进行自定义结构调整。要实现捕获响应到变量并生成自定义JSON,按以下方式修改策略:
修改后的完整策略
<policies> <inbound> <base /> <cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none"> <vary-by-header>Accept</vary-by-header> <vary-by-header>Accept-Charset</vary-by-header> </cache-lookup> <set-variable name="SASToken" value="@("sas key")" /> <set-variable name="TableStorageURL" value="@{string sastoken = context.Variables.GetValueOrDefault<string>("SASToken");return String.Format("https://storagedev.table.core.windows.net/data()?{0}", sastoken);}" /> <set-backend-service base-url="@($"{context.Variables.GetValueOrDefault("TableStorageURL")}")" /> </inbound> <backend> <base /> </backend> <outbound> <base /> <!-- 捕获原始XML响应到变量,preserveContent确保后续策略仍能访问响应 --> <set-variable name="OriginalTableResponse" value="@(context.Response.Body.As<string>(preserveContent: true))" /> <!-- 自定义生成目标JSON结构 --> <set-body>@{ // 读取变量中的XML响应内容 var xmlContent = context.Variables.GetValueOrDefault<string>("OriginalTableResponse"); var xmlDoc = System.Xml.Linq.XDocument.Parse(xmlContent); // 解析表存储返回的实体数据,替换为实际需要提取的字段 var tableEntities = xmlDoc.Descendants("entry").Select(entry => new { PartitionKey = entry.Descendants("PartitionKey").FirstOrDefault()?.Value, RowKey = entry.Descendants("RowKey").FirstOrDefault()?.Value, // 这里替换成你表中的自定义字段 Status = entry.Descendants("Status").FirstOrDefault()?.Value, CreateTime = entry.Descendants("CreateTime").FirstOrDefault()?.Value }); // 组装自定义JSON结构,按需调整外层格式 return Newtonsoft.Json.JsonConvert.SerializeObject(new { Total = tableEntities.Count(), Data = tableEntities }); }</set-body> <cache-store duration="1000" cache-response="true" /> </outbound> <on-error> <base /> </on-error> </policies>
关键说明
- 捕获响应到变量:
preserveContent: true参数必须加上,否则获取响应体后,后续策略会无法访问响应内容。 - XML解析与字段提取:用
System.Xml.Linq.XDocument解析表存储返回的XML格式响应,通过Descendants定位到实体字段,替换示例中的字段名为你表中的实际列名。 - 自定义JSON组装:通过
Newtonsoft.Json.JsonConvert.SerializeObject将解析后的字段组装成你需要的JSON结构,比如外层加总数、数据列表等。 - 若需要基于转换后的JSON再调整,可先执行
xml-to-json策略,再将转换后的JSON存入变量处理(示例中已注释该流程)。
内容的提问来源于stack exchange,提问作者CSR
相关产品推荐
相关产品推荐

