在多个 REST 请求上实现分页

在本例中,你将探索如何通过基于 REST 契约的 API 批量导出 Acumatica ERP 中的以下数据:

  • 申请中存在的库存项目,分 10 批记录
  • 所有销售订单分批 100 条记录

要通过多个 REST 调用以 10 个记录的批量导出库存项目:

要使用版本 6.00.001默认端点从本地 AcumaticaERP 实例导出前 10 个库存项目,你应使用以下 URL:http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10 ******

因此,要从 10 到 20 请求库存商品,你只需使用过滤器参数:http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10&$filter=InventoryID gt '<InventoryID>' 扩展上面的 URL

<InventoryID> 是使用先前 REST 调用导出的最后一个库存项目的 ID

下面是用 C#编写的示例代码,通过向版本 6.00.001默认端点发送多个 REST 调用,以 10 个记录的批量导出所有库存项 : ******

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=10";
    string items = rs.GetList("StockItem", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    while (records.Count == 10)
    {
        var inventoryID = records[records.Count - 1]["InventoryID"] as Dictionary<string, object>;
        var inventoryIDValue = inventoryID.Values.First();
        string nextParameters = parameters + "&" + 
            "$filter=" + string.Format("InventoryID gt '{0}'", inventoryIDValue);
        items = rs.GetList("StockItem", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
    }
}

要通过多个 REST 调用以 100 个记录的批量导出所有销售订单:

要使用版本 6.00.001默认端点从本地 AcumaticaERP 实例导出前 100 个销售订单,你应使用以下 URL:http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100 ******

由于“ 销售订单” 实体的主键由“ 订单类型” 和“ 订单号”组成,因此在此示例中,你将使用 “ 订单类型” 和“ 订单号” 字段的过滤器参数组合 : ****** ******

  • 要请求 100 到 200 个 SO 类型的销售订单,你应该使用以下 URL:http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType eq 'SO' and OrderNbr gt '<OrderNbr>'

<OrderNbr> 是使用先前 REST 调用导出的最后一个销售订单的编号

  • 因此,要请求下一个 SO 类型的前 100 个销售订单,你应该使用以下 URL:http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType gt 'SO' and OrderNbr gt ''

下面是用 C#编写的示例代码,用于将所有销售订单以 100 个记录的批量导出,并对 6.0006 版本的默认端点进行多次 REST 调用 : ******

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=100";
    string items = rs.GetList("SalesOrder", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    bool sameOrderType = true;
    while (records.Count > 0 && (records.Count == 100 || !sameOrderType))
    {
        var orderType = records[records.Count - 1]["OrderType"] as Dictionary<string, object>;
        var orderTypeValue = orderType.Values.First();
        var orderNbr = records[records.Count - 1]["OrderNbr"] as Dictionary<string, object>;
        var orderNbrValue = orderNbr.Values.First();

        string nextParameters = parameters + "&" + "$filter=" +
            string.Format("OrderType {0} '{1}'", sameOrderType ? "eq" : "gt", orderTypeValue) + " and " +
            string.Format("OrderNbr gt '{0}'", sameOrderType ? orderNbrValue : "''" );
        items = rs.GetList("SalesOrder", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
        sameOrderType = records.Count == 100;
    }
}