调用Azure DevOps REST API更新工作项状态返回400错误
Azure DevOps 工作项更新接口返回400错误排查
你的代码存在4个会直接触发400错误的问题,逐个修复即可:
- C#字符串语法错误:你直接在普通双引号字符串内写多行、嵌套双引号的JSON内容,没有做任何转义,实际运行时生成的字符串是语法损坏的,发出去的请求体根本不是合法JSON。不要手写JSON字符串,优先用JSON序列化库生成请求内容。
- PATCH操作符使用错误:更新工作项已存在的内置字段(
System.State/System.Reason/System.History均为内置字段)时,op参数需要用replace,add仅用于添加之前不存在的字段值或者向集合类字段追加元素,操作符不匹配会直接被接口参数校验拦截。 /rev字段值类型错误:工作项版本号rev是整数类型,你传了字符串格式的"4",类型不满足接口要求,必须传不带引号的数值类型。- Content-Type设置错误:Azure DevOps的JSON PATCH接口要求请求的Content-Type必须是
application/json-patch+json,你当前设置的普通application/json不会被接口识别为合法的PATCH请求格式。
修正后的可运行代码示例
using System.Net.Http; using System.Text; using System.Text.Json; // 构造PATCH请求体,用序列化方式生成JSON避免语法错误 var patchOperations = new object[] { new { op = "test", path = "/rev", value = 4 // rev为整数类型,不要加引号转成字符串 }, new { op = "replace", // 已有字段更新用replace操作 path = "/fields/System.State", value = "Blocked" }, new { op = "replace", path = "/fields/System.Reason", value = "State changed as part of PWR planning" }, new { op = "replace", path = "/fields/System.History", value = "State changed as part of PWR planning" } }; string requestJson = JsonSerializer.Serialize(patchOperations); // 必须指定正确的Content-Type为json-patch格式 var requestContent = new StringContent(requestJson, Encoding.UTF8, "application/json-patch+json"); HttpResponseMessage response = await HttpClient.PatchAsync( $"/{Org}/_apis/wit/workitems/{ID}?api-version=6.0", requestContent); // 调试时如果仍有报错,读取响应内容即可拿到明确的错误提示,比如状态流转不合法、Reason值不匹配等 // string errorDetail = await response.Content.ReadAsStringAsync();
额外说明:如果修复以上问题后仍返回400,直接读取响应正文即可拿到具体错误原因,常见的额外报错原因包括:目标状态
Blocked不在当前工作项类型的允许流转状态列表、System.Reason的值和目标状态不匹配、传入的rev值和工作项当前最新版本不匹配。
内容的提问来源于stack exchange,提问作者Annat Himmel
相关产品推荐
相关产品推荐

