调用Microsoft Graph Planner API Patch接口时出现冲突报错
解决Microsoft Graph Planner Patch任务时的冲突错误
问题描述
调用Microsoft Graph Planner API的Patch接口修改任务标题时,报错:
The attempted changes conflicted with already accepted changes. Read the latest state and resolve differences.
Postman中先执行Get任务接口再执行Update接口可正常运行,但Python中分开运行Get和Patch脚本(或手动用Postman获取ETag后在Python中使用)仍报错。
错误原因分析
- Authorization头格式错误:Python代码中
Authorization头直接使用access_token,缺少Bearer前缀,而Postman会自动添加该前缀,导致请求身份验证逻辑异常。 - ETag使用不当:
- 手动复制ETag时可能遗漏外层双引号,或者ETag在复制过程中已过期(任务状态被其他操作修改)。
- 分开运行Get和Patch脚本时,两次请求间隔内任务可能被其他操作更新,导致ETag失效。
- ETag提取错误:Get接口返回的ETag在响应头的
ETag字段中,而非响应体里,若从响应体提取会导致获取错误的ETag值。
解决方案
1. 修正Authorization头格式
在请求头中,Authorization的值必须是Bearer {access_token},补充前缀后才能正确通过身份验证。
2. 合并Get和Patch流程,自动获取并使用ETag
将获取任务和修改任务的逻辑合并到一个脚本中,自动从Get接口的响应头提取最新ETag,避免手动复制的错误和ETag过期问题。
修正后的完整代码:
import requests access_token = '你的access_token' task_id = '你的任务ID' # Step 1: 获取任务最新状态及ETag get_url = f'https://graph.microsoft.com/v1.0/planner/tasks/{task_id}' get_headers = { 'Authorization': f'Bearer {access_token}' } get_response = requests.get(url=get_url, headers=get_headers) get_response.raise_for_status() # 捕获请求错误 # 从响应头提取ETag task_etag = get_response.headers.get('ETag') if not task_etag: print("无法获取任务ETag") exit() # Step 2: 使用最新ETag执行Patch修改 patch_url = f'https://graph.microsoft.com/v1.0/planner/tasks/{task_id}' patch_headers = { 'Authorization': f'Bearer {access_token}', 'If-Match': task_etag } patch_data = { "title": "test" } patch_response = requests.patch(url=patch_url, headers=patch_headers, json=patch_data) print(patch_response.text)
3. 分开运行脚本时的注意事项
如果必须分开运行,需确保:
- 从Get接口的响应头中复制完整的ETag值(包括外层双引号),例如
"W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBAWCc=\""。 - 复制ETag后立即执行Patch脚本,避免期间任务被其他操作修改。
- 确认
Authorization头已添加Bearer前缀。
内容的提问来源于stack exchange,提问作者Hajaro
相关产品推荐
相关产品推荐

