在多个 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;
}
}