OneDrive Delta分页链接报错:第二页请求返回400错误
我之前调试Graph API的时候也踩过这个坑,你的问题大概率是请求格式不一致导致的——初始请求用的是REST风格的斜杠路径,而返回的下一页链接用了OData的括号语法,两种格式混用容易触发API解析错误。下面是几个靠谱的解决办法:
手动修正下一页链接格式
把返回的括号语法链接转换成斜杠+查询参数的格式:
原错误链接:https://graph.microsoft.com/v1.0/drives('<drive-id>')/root/microsoft.graph.delta(token='MzslMjMzOyUyMzE7Mzs5ZmY3MzExYy0yYzRmLTQwZGMtYmVjNS0zMWI3NDXXXX...')
修正后:https://graph.microsoft.com/v1.0/drives/<drive-id>/root/microsoft.graph.delta?token=MzslMjMzOyUyMzE7Mzs5ZmY3MzExYy0yYzRmLTQwZGMtYmVjNS0zMWI3NDXXXX...
关键点:去掉drive-id和token的单引号,把token从括号里移到查询参数位置。使用Microsoft Graph SDK自动处理分页
如果你的项目允许用SDK,直接用官方SDK来处理delta分页会省心很多,它会自动处理链接格式和token传递,完全不用手动拼接。举个Python的简单示例:from msgraph import GraphServiceClient from azure.identity import ClientSecretCredential # 初始化客户端 cred = ClientSecretCredential(tenant_id="<tenant-id>", client_id="<client-id>", client_secret="<client-secret>") client = GraphServiceClient(cred) # 获取delta分页迭代器 delta_iterator = client.drives["<drive-id>"].root.delta().get_paging_iter() for page in delta_iterator: # 处理当前页的文件/文件夹数据 for item in page.value: print(item.name)检查token是否完整
注意你提供的下一页链接里token末尾有XXXX...的省略号,要确认实际拿到的token是完整的——如果token被截断,API会因为无法解析而返回400错误。保持请求头一致性
第二页的请求要和初始请求使用完全相同的授权头(Authorization: Bearer <token>)、Accept头(比如application/json),任何头信息的变更都可能导致请求失败。
一般来说,修正链接格式就能解决这个问题,要是还不行,可以抓包看一下400错误的详细响应信息,里面会有更具体的错误提示(比如invalidRequest的具体原因)。
内容的提问来源于stack exchange,提问作者Will

