Business Central Server-Driven Paging:C#中利用@odata.nextLink实现分页请求
OData分页请求改造示例(自动处理@odata.nextLink)
针对你有1万条数据、单请求超时的问题,下面是改造后的分页逻辑代码,通过do-while循环自动遍历所有@odata.nextLink,每次请求1000条数据,分10次完成全部数据拉取:
改造后完整代码
using System; using System.IO; using System.Net; using System.Text; using Newtonsoft.Json.Linq; // 需要引用Newtonsoft.Json NuGet包 // 假设CONTENTTYPE、GET_WebMethod为已定义常量,Authorization为传入的授权头字符串 public string GetAllODataData(string initialUrl) { StringBuilder allResults = new StringBuilder(); bool hasNextPage = true; string currentUrl = initialUrl; bool isFirstResponse = true; do { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(currentUrl); request.Headers.Add("Prefer", "odata.maxpagesize=1000"); request.ContentType = CONTENTTYPE; request.Method = GET_WebMethod; if (!String.IsNullOrEmpty(Authorization)) request.Headers.Add(HttpRequestHeader.Authorization, Authorization); using (var httpResponse = (HttpWebResponse)request.GetResponse()) using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { string responseContent = streamReader.ReadToEnd(); JObject responseJson = JObject.Parse(responseContent); // 提取当前页的数据数组 JArray currentData = (JArray)responseJson["value"]; // 拼接所有分页数据,保持JSON结构完整 if (isFirstResponse) { allResults.Append("{\"value\": ["); allResults.Append(currentData.ToString(Newtonsoft.Json.Formatting.None).TrimStart('[').TrimEnd(']')); isFirstResponse = false; } else { allResults.Append("," + currentData.ToString(Newtonsoft.Json.Formatting.None).TrimStart('[').TrimEnd(']')); } // 检查是否存在下一页链接 JToken nextLinkToken = responseJson["@odata.nextLink"]; hasNextPage = nextLinkToken != null && !string.IsNullOrEmpty(nextLinkToken.ToString()); if (hasNextPage) { currentUrl = nextLinkToken.ToString(); } } } while (hasNextPage); // 补全JSON结构 allResults.Append("]}"); return allResults.ToString(); }
关键说明
- 循环逻辑:用
do-while确保至少发起一次请求,之后每次根据响应里的@odata.nextLink判断是否继续请求下一页 - 数据合并:通过
StringBuilder拼接所有分页的value数组,最终返回结构完整的JSON结果 - 依赖要求:需要安装
Newtonsoft.JsonNuGet包,用于解析JSON中的分页链接和数据数组 - 请求一致性:每次循环重新创建
HttpWebRequest,确保授权头等请求头正确传递
注意事项
- 如果你的响应JSON结构特殊,需要调整
responseJson["value"]和responseJson["@odata.nextLink"]的字段路径 - 可根据需求添加异常处理(如请求失败重试、超时设置),避免单次请求中断整体流程
内容的提问来源于stack exchange,提问作者accountdev253
相关产品推荐
相关产品推荐

