You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:45:00